* [PATCH 0/2] Improve performance for native/cross/crosssdk's cleansstate
@ 2018-11-22 11:51 Robert Yang
2018-11-22 11:51 ` [PATCH 1/2] nopackages.bbclass: improve performance for cleansstate Robert Yang
2018-11-22 11:51 ` [PATCH 2/2] sstate.bbclass: set SSTATE_EXTRAPATHWILDCARD explicitly Robert Yang
0 siblings, 2 replies; 5+ messages in thread
From: Robert Yang @ 2018-11-22 11:51 UTC (permalink / raw)
To: openembedded-core
Hi RP and Ross,
These 2 patches can improve performance a lot for native/cross/crosssdk's
cleansstate:
This test is based on more than 600,000 sstate files
* Without disk caches
# echo 3 >/proc/sys/vm/drop_caches
$ bitbake -p
$ time bitbake quilt-native -ccleansstate
- Before:
real 4m53.815s
user 0m0.820s
sys 0m0.128s
- After
real 0m58.483s
user 0m0.744s
sys 0m0.108s
Saved 293 - 58 = 235s (80% improvement)
* With disk caches (26.6s -> 5.8s, 78% improvement)
$ bitbake -p
$ time bitbake quilt-native -ccleansstate
- Before:
real 0m26.682s
user 0m0.748s
sys 0m0.088s
- After
real 0m5.846s
user 0m0.716s
sys 0m0.116s
Saved 26.6 - 5.8 = 20.8s (78% improvement)
======
I have another idea is put sstate files into the directory
named by the recipe, e.g.:
sstate-cache/quilt-native/sstate:quilt-native::0.65:r0::3:773341447192feb6c1519cace0e6be35_populate_lic.tgz
sstate-cache/quilt-native/sstate:quilt-native::0.65:r0::3:773341447192feb6c1519cace0e6be35_populate_lic.tgz.siginfo
sstate-cache/quilt-native/sstate:quilt-native::0.65:r0::3:ab4a82a07b10926bb42d2f37242413c7_patch.tgz.siginfo
sstate-cache/quilt-native/sstate:quilt-native::0.65:r0::3:e8a4c952a66942653e36f289eaf68ca5_fetch.tgz.siginfo
sstate-cache/quilt-native/sstate:quilt-native::0.65:r0::3:fd35240c437cefa66e24cfe65d3fb335_unpack.tgz.siginfo
This can make it easier to manage sstate files, and can reduce the load of
glob.glob(), currently, the remove command is something like:
$ rm -f glob.glob(sstate-cache/*/sstate:foo.*bar.*)
If we put them into recipe named directory, then we can run:
$ rm -f glob.glob(sstate-cache/<recipe>/sstate:foo.*bar.*)
Which should be faster, what's your opinion, please ?
// Robert
The following changes since commit fc5418e7bbdecfb27bafe595084e0fd0f991a388:
meta/icecc.bbclass: Update system blacklists (2018-11-21 11:48:18 +0000)
are available in the git repository at:
git://git.openembedded.org/openembedded-core-contrib rbt/sstate
http://cgit.openembedded.org/openembedded-core-contrib/log/?h=rbt/sstate
Robert Yang (2):
nopackages.bbclass: improve performance for cleansstate
sstate.bbclass: set SSTATE_EXTRAPATHWILDCARD explicitly
meta/classes/nopackages.bbclass | 35 +++++++++++++++++++++++------------
meta/classes/sstate.bbclass | 2 +-
2 files changed, 24 insertions(+), 13 deletions(-)
--
2.7.4
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] nopackages.bbclass: improve performance for cleansstate
2018-11-22 11:51 [PATCH 0/2] Improve performance for native/cross/crosssdk's cleansstate Robert Yang
@ 2018-11-22 11:51 ` Robert Yang
2018-11-22 12:15 ` Richard Purdie
2018-11-22 11:51 ` [PATCH 2/2] sstate.bbclass: set SSTATE_EXTRAPATHWILDCARD explicitly Robert Yang
1 sibling, 1 reply; 5+ messages in thread
From: Robert Yang @ 2018-11-22 11:51 UTC (permalink / raw)
To: openembedded-core
Leave the task in SSTATETASKS doesn't make sense when it is removed, so also
remove it from SSTATETASKS.
This can improve the performance a lot for "bitbake <recipe-native/cross/crosssdk>
-ccleansstate" when there are a lot of sstate files.
For example:
* Before
$ bitbake quilt-native -ccleansstate
- Check log.do_cleansstate:
Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-linux:0.65:r0:x86_64:3:*_package.tgz*
Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-linux:0.65:r0:x86_64:3:*_package_qa.tgz*
Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-linux:0.65:r0:x86_64:3:*_package_write_rpm.tgz*
Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-linux:0.65:r0:x86_64:3:*_packagedata.tgz*
Removing /sstate-cache/*/sstate:quilt-native::0.65:r0::3:*_populate_lic.tgz*
Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-linux:0.65:r0:x86_64:3:*_populate_sysroot.tgz*
There are no package tasks for quilt-native, so the first 4 lines doesn't
make any sense, but the glob pattern "sstate-cache/*/*" is very time
consuming when there are no disk caches. E.g., I have more than 600,000
sstate files:
- Without disk caches
# echo 3 >/proc/sys/vm/drop_caches
$ time python3 -c 'import glob; glob.glob("/sstate-cache/*/*/sstate:quilt-native:x86_64-linux:0.65:r0:x86_64:3:*_package.tgz*")'
real 4m32.583s
user 0m5.768s
sys 0m12.892s
- With disk caches (e.g., run it in the second time)
$ time python3 -c 'import glob; glob.glob("/sstate-cache/*/*/sstate:quilt-native:x86_64-linux:0.65:r0:x86_64:3:*_package.tgz*")'
real 0m5.128s
user 0m2.772s
sys 0m2.308s
So the 4 removing *package* commands cost more than 20s or 272s in theory.
* After
$ bitbake quilt-native -ccleansstate
- Check log.do_cleansstate:
Removing /sstate-cache/*/sstate:quilt-native::0.65:r0::3:*_populate_lic.tgz*
Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-linux:0.65:r0:x86_64:3:*_populate_sysroot.tgz*
Now the package tasks are gone when cleanssate for native recipes, which
saved 20s or 272s in theory.
Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
meta/classes/nopackages.bbclass | 35 +++++++++++++++++++++++------------
1 file changed, 23 insertions(+), 12 deletions(-)
diff --git a/meta/classes/nopackages.bbclass b/meta/classes/nopackages.bbclass
index 559f507..66e4936 100644
--- a/meta/classes/nopackages.bbclass
+++ b/meta/classes/nopackages.bbclass
@@ -1,12 +1,23 @@
-deltask do_package
-deltask do_package_write_rpm
-deltask do_package_write_ipk
-deltask do_package_write_deb
-deltask do_package_qa
-deltask do_packagedata
-deltask do_package_setscene
-deltask do_package_write_rpm_setscene
-deltask do_package_write_ipk_setscene
-deltask do_package_write_deb_setscene
-deltask do_package_qa_setscene
-deltask do_packagedata_setscene
+NO_PACKAGES_TASKS = " \
+ do_package \
+ do_package_write_rpm \
+ do_package_write_ipk \
+ do_package_write_deb \
+ do_package_qa \
+ do_packagedata \
+"
+
+python() {
+ sstatetasks = (d.getVar('SSTATETASKS') or '').split()
+ for task in d.getVar('NO_PACKAGES_TASKS').split():
+ setscene_task = '%s_setscene' % task
+ tasks = (task, setscene_task)
+ for t in tasks:
+ bb.build.deltask(t, d)
+
+ if task in sstatetasks:
+ bb.debug(2, 'Removing sstate task %s from SSTATETASKS' % task)
+ sstatetasks.remove(task)
+ d.setVar('SSTATETASKS', ' '.join(sstatetasks))
+
+}
--
2.7.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] sstate.bbclass: set SSTATE_EXTRAPATHWILDCARD explicitly
2018-11-22 11:51 [PATCH 0/2] Improve performance for native/cross/crosssdk's cleansstate Robert Yang
2018-11-22 11:51 ` [PATCH 1/2] nopackages.bbclass: improve performance for cleansstate Robert Yang
@ 2018-11-22 11:51 ` Robert Yang
1 sibling, 0 replies; 5+ messages in thread
From: Robert Yang @ 2018-11-22 11:51 UTC (permalink / raw)
To: openembedded-core
The glob.glob("/sstate/*/*/") is very time consuming, set
SSTATE_EXTRAPATHWILDCARD explicity to avoid that. This can save a lot of time
when there are many sstate files.
For example, I have more than 600,000 sstate files:
* Before
- Without disk caches
$ time python3 -c 'import glob; glob.glob("/sstate-cache/*/*/sstate:quilt-native:x86_64-linux:0.65:r0:x86_64:3:*_populate_sysroot.tgz*")'
real 4m32.583s
user 0m5.768s
sys 0m12.892s
- With disk caches
$ time python3 -c 'import glob; glob.glob("/sstate-cache/*/*/sstate:quilt-native:x86_64-linux:0.65:r0:x86_64:3:*_populate_sysroot.tgz*")'
real 0m4.111s
user 0m2.348s
sys 0m1.756s
* After
$ time python3 -c 'import glob; glob.glob("/sstate-cache.bak/universal/*/sstate:quilt-native:x86_64-linux:0.65:r0:x86_64:3:*_populate_sysroot.tgz*")'
- Without disk caches:
real 0m7.928s
user 0m0.172s
sys 0m0.124s
- With disk caches:
real 0m0.131s
user 0m0.088s
sys 0m0.044s
We can see that it saves about 3.8s with disk caches, and saves about 264s
without disk caches.
Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
meta/classes/sstate.bbclass | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass
index efb0096..94fde6d 100644
--- a/meta/classes/sstate.bbclass
+++ b/meta/classes/sstate.bbclass
@@ -101,7 +101,7 @@ python () {
if bb.data.inherits_class('native', d) or bb.data.inherits_class('crosssdk', d) or bb.data.inherits_class('cross', d):
d.setVar('SSTATE_EXTRAPATH', "${NATIVELSBSTRING}/")
d.setVar('BB_HASHFILENAME', "True ${SSTATE_PKGSPEC} ${SSTATE_SWSPEC}")
- d.setVar('SSTATE_EXTRAPATHWILDCARD', "*/")
+ d.setVar('SSTATE_EXTRAPATHWILDCARD', "${NATIVELSBSTRING}/")
unique_tasks = sorted(set((d.getVar('SSTATETASKS') or "").split()))
d.setVar('SSTATETASKS', " ".join(unique_tasks))
--
2.7.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] nopackages.bbclass: improve performance for cleansstate
2018-11-22 11:51 ` [PATCH 1/2] nopackages.bbclass: improve performance for cleansstate Robert Yang
@ 2018-11-22 12:15 ` Richard Purdie
2018-11-22 12:47 ` Yang, Liezhi
0 siblings, 1 reply; 5+ messages in thread
From: Richard Purdie @ 2018-11-22 12:15 UTC (permalink / raw)
To: Robert Yang, openembedded-core
On Thu, 2018-11-22 at 19:51 +0800, Robert Yang wrote:
> Leave the task in SSTATETASKS doesn't make sense when it is removed,
> so also
> remove it from SSTATETASKS.
>
> This can improve the performance a lot for "bitbake <recipe-
> native/cross/crosssdk>
> -ccleansstate" when there are a lot of sstate files.
>
> For example:
> * Before
> $ bitbake quilt-native -ccleansstate
> - Check log.do_cleansstate:
> Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-
> linux:0.65:r0:x86_64:3:*_package.tgz*
> Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-
> linux:0.65:r0:x86_64:3:*_package_qa.tgz*
> Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-
> linux:0.65:r0:x86_64:3:*_package_write_rpm.tgz*
> Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-
> linux:0.65:r0:x86_64:3:*_packagedata.tgz*
> Removing /sstate-cache/*/sstate:quilt-
> native::0.65:r0::3:*_populate_lic.tgz*
> Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-
> linux:0.65:r0:x86_64:3:*_populate_sysroot.tgz*
>
> There are no package tasks for quilt-native, so the first 4 lines
> doesn't
> make any sense, but the glob pattern "sstate-cache/*/*" is very
> time
> consuming when there are no disk caches. E.g., I have more than
> 600,000
> sstate files:
> - Without disk caches
> # echo 3 >/proc/sys/vm/drop_caches
> $ time python3 -c 'import glob; glob.glob("/sstate-
> cache/*/*/sstate:quilt-native:x86_64-
> linux:0.65:r0:x86_64:3:*_package.tgz*")'
> real 4m32.583s
> user 0m5.768s
> sys 0m12.892s
>
> - With disk caches (e.g., run it in the second time)
> $ time python3 -c 'import glob; glob.glob("/sstate-
> cache/*/*/sstate:quilt-native:x86_64-
> linux:0.65:r0:x86_64:3:*_package.tgz*")'
> real 0m5.128s
> user 0m2.772s
> sys 0m2.308s
>
> So the 4 removing *package* commands cost more than 20s or 272s in
> theory.
>
> * After
> $ bitbake quilt-native -ccleansstate
> - Check log.do_cleansstate:
> Removing /sstate-cache/*/sstate:quilt-
> native::0.65:r0::3:*_populate_lic.tgz*
> Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-
> linux:0.65:r0:x86_64:3:*_populate_sysroot.tgz*
>
> Now the package tasks are gone when cleanssate for native recipes,
> which
> saved 20s or 272s in theory.
>
> Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
> ---
> meta/classes/nopackages.bbclass | 35 +++++++++++++++++++++++------
> ------
> 1 file changed, 23 insertions(+), 12 deletions(-)
>
> diff --git a/meta/classes/nopackages.bbclass
> b/meta/classes/nopackages.bbclass
> index 559f507..66e4936 100644
> --- a/meta/classes/nopackages.bbclass
> +++ b/meta/classes/nopackages.bbclass
> @@ -1,12 +1,23 @@
> -deltask do_package
> -deltask do_package_write_rpm
> -deltask do_package_write_ipk
> -deltask do_package_write_deb
> -deltask do_package_qa
> -deltask do_packagedata
> -deltask do_package_setscene
> -deltask do_package_write_rpm_setscene
> -deltask do_package_write_ipk_setscene
> -deltask do_package_write_deb_setscene
> -deltask do_package_qa_setscene
> -deltask do_packagedata_setscene
> +NO_PACKAGES_TASKS = " \
> + do_package \
> + do_package_write_rpm \
> + do_package_write_ipk \
> + do_package_write_deb \
> + do_package_qa \
> + do_packagedata \
> +"
> +
> +python() {
> + sstatetasks = (d.getVar('SSTATETASKS') or '').split()
> + for task in d.getVar('NO_PACKAGES_TASKS').split():
> + setscene_task = '%s_setscene' % task
> + tasks = (task, setscene_task)
> + for t in tasks:
> + bb.build.deltask(t, d)
> +
> + if task in sstatetasks:
> + bb.debug(2, 'Removing sstate task %s from SSTATETASKS' %
> task)
> + sstatetasks.remove(task)
> + d.setVar('SSTATETASKS', ' '.join(sstatetasks))
> +
> +}
I really don't want to turn more comparatively readable classes into a
mess of anonymous python if we can help it.
Can we not just teach cleansstate to check if a task exists before
trying to delete the sstate? It should be possible with
d.getVarFlag(taskname, "task")?
Cheers,
Richard
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] nopackages.bbclass: improve performance for cleansstate
2018-11-22 12:15 ` Richard Purdie
@ 2018-11-22 12:47 ` Yang, Liezhi
0 siblings, 0 replies; 5+ messages in thread
From: Yang, Liezhi @ 2018-11-22 12:47 UTC (permalink / raw)
To: Richard Purdie; +Cc: openembedded-core@lists.openembedded.org
Sent from mobile phone
> 在 2018年11月22日,20:15,Richard Purdie <richard.purdie@linuxfoundation.org> 写道:
>
>> On Thu, 2018-11-22 at 19:51 +0800, Robert Yang wrote:
>> Leave the task in SSTATETASKS doesn't make sense when it is removed,
>> so also
>> remove it from SSTATETASKS.
>>
>> This can improve the performance a lot for "bitbake <recipe-
>> native/cross/crosssdk>
>> -ccleansstate" when there are a lot of sstate files.
>>
>> For example:
>> * Before
>> $ bitbake quilt-native -ccleansstate
>> - Check log.do_cleansstate:
>> Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-
>> linux:0.65:r0:x86_64:3:*_package.tgz*
>> Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-
>> linux:0.65:r0:x86_64:3:*_package_qa.tgz*
>> Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-
>> linux:0.65:r0:x86_64:3:*_package_write_rpm.tgz*
>> Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-
>> linux:0.65:r0:x86_64:3:*_packagedata.tgz*
>> Removing /sstate-cache/*/sstate:quilt-
>> native::0.65:r0::3:*_populate_lic.tgz*
>> Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-
>> linux:0.65:r0:x86_64:3:*_populate_sysroot.tgz*
>>
>> There are no package tasks for quilt-native, so the first 4 lines
>> doesn't
>> make any sense, but the glob pattern "sstate-cache/*/*" is very
>> time
>> consuming when there are no disk caches. E.g., I have more than
>> 600,000
>> sstate files:
>> - Without disk caches
>> # echo 3 >/proc/sys/vm/drop_caches
>> $ time python3 -c 'import glob; glob.glob("/sstate-
>> cache/*/*/sstate:quilt-native:x86_64-
>> linux:0.65:r0:x86_64:3:*_package.tgz*")'
>> real 4m32.583s
>> user 0m5.768s
>> sys 0m12.892s
>>
>> - With disk caches (e.g., run it in the second time)
>> $ time python3 -c 'import glob; glob.glob("/sstate-
>> cache/*/*/sstate:quilt-native:x86_64-
>> linux:0.65:r0:x86_64:3:*_package.tgz*")'
>> real 0m5.128s
>> user 0m2.772s
>> sys 0m2.308s
>>
>> So the 4 removing *package* commands cost more than 20s or 272s in
>> theory.
>>
>> * After
>> $ bitbake quilt-native -ccleansstate
>> - Check log.do_cleansstate:
>> Removing /sstate-cache/*/sstate:quilt-
>> native::0.65:r0::3:*_populate_lic.tgz*
>> Removing /sstate-cache/*/*/sstate:quilt-native:x86_64-
>> linux:0.65:r0:x86_64:3:*_populate_sysroot.tgz*
>>
>> Now the package tasks are gone when cleanssate for native recipes,
>> which
>> saved 20s or 272s in theory.
>>
>> Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
>> ---
>> meta/classes/nopackages.bbclass | 35 +++++++++++++++++++++++------
>> ------
>> 1 file changed, 23 insertions(+), 12 deletions(-)
>>
>> diff --git a/meta/classes/nopackages.bbclass
>> b/meta/classes/nopackages.bbclass
>> index 559f507..66e4936 100644
>> --- a/meta/classes/nopackages.bbclass
>> +++ b/meta/classes/nopackages.bbclass
>> @@ -1,12 +1,23 @@
>> -deltask do_package
>> -deltask do_package_write_rpm
>> -deltask do_package_write_ipk
>> -deltask do_package_write_deb
>> -deltask do_package_qa
>> -deltask do_packagedata
>> -deltask do_package_setscene
>> -deltask do_package_write_rpm_setscene
>> -deltask do_package_write_ipk_setscene
>> -deltask do_package_write_deb_setscene
>> -deltask do_package_qa_setscene
>> -deltask do_packagedata_setscene
>> +NO_PACKAGES_TASKS = " \
>> + do_package \
>> + do_package_write_rpm \
>> + do_package_write_ipk \
>> + do_package_write_deb \
>> + do_package_qa \
>> + do_packagedata \
>> +"
>> +
>> +python() {
>> + sstatetasks = (d.getVar('SSTATETASKS') or '').split()
>> + for task in d.getVar('NO_PACKAGES_TASKS').split():
>> + setscene_task = '%s_setscene' % task
>> + tasks = (task, setscene_task)
>> + for t in tasks:
>> + bb.build.deltask(t, d)
>> +
>> + if task in sstatetasks:
>> + bb.debug(2, 'Removing sstate task %s from SSTATETASKS' %
>> task)
>> + sstatetasks.remove(task)
>> + d.setVar('SSTATETASKS', ' '.join(sstatetasks))
>> +
>> +}
>
> I really don't want to turn more comparatively readable classes into a
> mess of anonymous python if we can help it.
>
> Can we not just teach cleansstate to check if a task exists before
> trying to delete the sstate? It should be possible with
> d.getVarFlag(taskname, "task")?
Thanks, yes, this is my first thought, but I only knew __BBTASKS which is an internal var of bitbake, I will use d.getVarFlag(taskname, "task") to send a v2.
// Robert
>
> Cheers,
>
> Richard
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2018-11-22 12:47 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-11-22 11:51 [PATCH 0/2] Improve performance for native/cross/crosssdk's cleansstate Robert Yang
2018-11-22 11:51 ` [PATCH 1/2] nopackages.bbclass: improve performance for cleansstate Robert Yang
2018-11-22 12:15 ` Richard Purdie
2018-11-22 12:47 ` Yang, Liezhi
2018-11-22 11:51 ` [PATCH 2/2] sstate.bbclass: set SSTATE_EXTRAPATHWILDCARD explicitly Robert Yang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox