Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!

Bug 276813

Summary: sys-apps/portage Performance improvement
Product: Portage Development Reporter: Marat Radchenko <marat>
Component: CoreAssignee: Portage team <dev-portage>
Status: RESOLVED FIXED    
Severity: enhancement CC: drobbins, marat
Priority: High    
Version: unspecified   
Hardware: All   
OS: Linux   
Whiteboard:
Package list:
Runtime testing required: ---
Bug Depends on:    
Bug Blocks: 835380, 210077, 288499    
Attachments: cache_heavy_regexes.patch
faster_loops_in_setcpv_v1.patch
faster_loops_in_setcpv_v2.patch
faster_loops_in_setcpv_v4.patch
use_readlines_when_reading_whole_file.patch
Removes getattr call from Task
build tuple in one go in catpkgsplit instead of array + extend + tuple()
implements isvalidatom using regex
Simplifies isvalidatom regex and adds comments
Fixed verbose regex
even simpler regex
Even more simpler regex
Turns Package.metadata into a dict
Use existing atom instances instead of doing Atom(Atom)
Adds caching to module_wrapper
Makes Atom inherit from str and increases Atom creation rate from 1.2k per second to 1.6k
Simplify match_to_list down to single list comprehension
Optimizes unicode wrappers by avoiding redundant isinstance checks
Improves vartree.getpath timing from 1.2 msec to 100 usec
Improves porttree.auxget timings from 11msec down to 5.8msec

Description Marat Radchenko 2009-07-06 19:02:43 UTC
In its current shape, portage has serious performance problems (mostly cpu-wise). Is has acceptable speed on desktop/server but on embedded or low-end devices, using portage is a real pain.

This bug is intended to track patches/ideas related to performance improvements.
Comment 1 Marat Radchenko 2009-07-07 06:27:51 UTC
Created attachment 196987 [details, diff]
cache_heavy_regexes.patch

cache_heavy_regexes.patch uses dict-based cache to reuse extremely heavy regexes from Package.regex and dbapi._iter_match_use. Additionally, _iter_match_use no longer builds one huge regex, but splits it into implicit/explicit. Implicit part (very large) is same fo all packages so it avoids heavy recompilation.

`emerge -vpuND world system` goes down from 4:00 to 3:35 mins on my 400mhz armv6 box with this patch.
Comment 2 Marat Radchenko 2009-07-07 07:13:03 UTC
cache_heavy_regexes.patch was applied (in modified form) as r13801.
Comment 3 Marat Radchenko 2009-07-10 07:18:49 UTC
Created attachment 197434 [details, diff]
faster_loops_in_setcpv_v1.patch

faster_loops_in_setcpv_v1.patch improves performance of setcpv by using list comprehensions instead of manual loops wherever possible. It reduces `emerge -puND world system` from 3:35 to 3:20.
Comment 4 Marat Radchenko 2009-07-10 07:28:21 UTC
Created attachment 197437 [details, diff]
faster_loops_in_setcpv_v2.patch

faster_loops_in_setcpv_v2.patch is an alternative approach to setcpv performance improvement (see previous comment).

Instead of doing len(use_expand_split) * len(iuse_implicit) loops, this patch iterates over iuse_implicit once, builds a dict of prefix/[iuse_implicit] and then iterates over entries of this dict.

It reduces `emerge -puND world system` from 3:35 to 3:05.
Comment 5 Zac Medico gentoo-dev 2009-07-11 20:25:28 UTC
(In reply to comment #3)
> Created an attachment (id=197434) [edit]
> faster_loops_in_setcpv_v1.patch

Thanks, this is in svn r13815.


(In reply to comment #4)
> Created an attachment (id=197437) [edit]
> faster_loops_in_setcpv_v2.patch

+		use_expand_iuses = dict()
+		for item in iuse_implicit:
+			s = item.split("_", 1)
+			if len(s) > 1:
+				prefix = s[0]
+				l = use_expand_iuses.get(prefix, set())
+				if not l:
+					use_expand_iuses[prefix] = l
+				l.add(item)

This part seems to assume that prefix does not contain underscore, which is not true for things like video_cards.
Comment 6 Zac Medico gentoo-dev 2009-07-12 23:06:18 UTC
(In reply to comment #5)
> (In reply to comment #4)
> > Created an attachment (id=197437) [edit]
> > faster_loops_in_setcpv_v2.patch
>
> This part seems to assume that prefix does not contain underscore, which is not
> true for things like video_cards.

In svn r13823 I've committed a version of this optimization which accounts for the above issue.
Comment 7 Marat Radchenko 2009-07-13 19:02:48 UTC
Created attachment 197827 [details, diff]
faster_loops_in_setcpv_v4.patch

faster_loops_in_setcpv_v4.patch makes setcpv even more faster
Comment 8 Zac Medico gentoo-dev 2009-07-16 21:45:16 UTC
(In reply to comment #7)
> Created an attachment (id=197827) [edit]
> faster_loops_in_setcpv_v4.patch
> 
> faster_loops_in_setcpv_v4.patch makes setcpv even more faster

How much faster is it? It's a lot less readable. Also, I think those x[:len(y)] == y comparisons should really be x[:len(y)+1] == y + "_".
Comment 9 Marat Radchenko 2009-07-17 06:59:30 UTC
Created attachment 198253 [details, diff]
use_readlines_when_reading_whole_file.patch

use_readlines_when_reading_whole_file.patch

This patch makes `emerge -puND world system` 5% faster by using file.readline()  instead of list(file).
Comment 10 Zac Medico gentoo-dev 2009-07-19 22:02:38 UTC
(In reply to comment #9)
> Created an attachment (id=198253) [edit]
> use_readlines_when_reading_whole_file.patch

Thanks, that's in svn r13834.
Comment 11 Zac Medico gentoo-dev 2009-08-03 23:12:31 UTC
This is fixed in 2.2_rc34.
Comment 12 Marat Radchenko 2009-09-06 13:06:13 UTC
Created attachment 203267 [details, diff]
Removes getattr call from Task
Comment 13 Marat Radchenko 2009-09-06 13:07:58 UTC
Created attachment 203269 [details, diff]
build tuple in one go in catpkgsplit instead of array + extend + tuple()
Comment 14 Marat Radchenko 2009-09-06 13:24:40 UTC
Just ideas:
1. Split load_emerge_config into separate config/vartree reads. It'll speedup things that do not actually need vartree (--help as one example). Low priority.
2. Rewrite isvalidatom & friends with regexes. It currently uses ~20% of all init time (before depgraph creation).
3. Make emerge functions bypass unicode module and function wrappers introduced recently. That's 20% more of init time.
Comment 15 Zac Medico gentoo-dev 2009-09-07 02:59:19 UTC
(In reply to comment #12)
> Created an attachment (id=203267) [edit]
> Removes getattr call from Task
(In reply to comment #13)
> Created an attachment (id=203269) [edit]
> build tuple in one go in catpkgsplit instead of array + extend + tuple()

Thanks, those are in svn r14209 and r14211.
Comment 16 Marat Radchenko 2009-09-07 20:25:43 UTC
Created attachment 203406 [details, diff]
implements isvalidatom using regex

Attached patch reimplements isvalidatom using regex. It reduces time spent in isvalidatom from 10 to 2 seconds doing 'emerge -vp paludis' (43->35 'user' total). It also should improve repoman dependency checking.

The only known problem is over relaxed pkg name part, which is supposed to reject pkg name that 'ends in a hyphen followed by one or more digits' '~foo/bar-1-0.5', but allows it instead. However previous implementation also  allowed it, so no regression problem is introduced.
Comment 17 Alec Warner (RETIRED) archtester gentoo-dev Security 2009-09-07 21:21:28 UTC
(In reply to comment #16)
> Created an attachment (id=203406) [edit]
> implements isvalidatom using regex
> 
> Attached patch reimplements isvalidatom using regex. It reduces time spent in
> isvalidatom from 10 to 2 seconds doing 'emerge -vp paludis' (43->35 'user'
> total). It also should improve repoman dependency checking.
> 
> The only known problem is over relaxed pkg name part, which is supposed to
> reject pkg name that 'ends in a hyphen followed by one or more digits'
> '~foo/bar-1-0.5', but allows it instead. However previous implementation also 
> allowed it, so no regression problem is introduced.
> 

I would modify the test to actually fail on foo-1-3-5 whatever.  If the code is 'broken' the test should also be broken.  I believe I wrote code that you could use to mark the test as an expected failure so it can be fixed later.
Comment 18 Zac Medico gentoo-dev 2009-09-07 22:39:54 UTC
(In reply to comment #16)
> Created an attachment (id=203406) [edit]
> implements isvalidatom using regex

Thanks, that's is svn r14213.
Comment 19 Marat Radchenko 2009-09-08 16:32:03 UTC
Created attachment 203509 [details, diff]
Simplifies isvalidatom regex and adds comments

Attached patch greatly simplifies atom regex (winning even more performance) and turns it in verbose mode with comments. Added more corner case tests.
Comment 20 Marat Radchenko 2009-09-08 16:59:47 UTC
Created attachment 203512 [details, diff]
Fixed verbose regex

I somehow messed up with previous patch, this is a corrected version.
Comment 21 Marat Radchenko 2009-09-08 17:16:03 UTC
Created attachment 203515 [details, diff]
even simpler regex
Comment 22 Marat Radchenko 2009-09-08 17:56:07 UTC
Created attachment 203519 [details, diff]
Even more simpler regex

Sorry for spam :( this is the last version.
Comment 23 Zac Medico gentoo-dev 2009-09-08 18:12:25 UTC
(In reply to comment #22)
> Created an attachment (id=203519) [edit]

Thanks, this is in svn r14219.
Comment 24 Marat Radchenko 2009-09-19 07:51:24 UTC
Created attachment 204572 [details, diff]
Turns Package.metadata into a dict

Attached patch increases Package creation speed by turning Package.metadata into a dict and avoiding slow reflection.
Comment 25 Zac Medico gentoo-dev 2009-09-19 12:59:18 UTC
(In reply to comment #24)
> Created an attachment (id=204572) [edit]
> Turns Package.metadata into a dict

Thanks, this is in svn r14280.
Comment 26 Marat Radchenko 2009-09-19 13:18:47 UTC
Created attachment 204597 [details, diff]
Use existing atom instances instead of doing Atom(Atom)

Attached patch makes code to use existing atom instances instead of doing Atom(Atom). Also, cpv_getkey is done with regex now.

This patch reduces atom creations from 70k to 18k on emerge -puND world here (having 1.3k per second, that saves 40 seconds!).
Comment 27 Zac Medico gentoo-dev 2009-09-19 17:07:05 UTC
(In reply to comment #26)
> Created an attachment (id=204597) [edit]
> Use existing atom instances instead of doing Atom(Atom)

Thanks, that's in svn r14282.
Comment 28 Marat Radchenko 2009-09-20 10:36:41 UTC
Created attachment 204673 [details, diff]
Adds caching to module_wrapper

Attached patch adds caching to module_wrapper.
That reduces time of 'emerge -vp paludis' from 35 to 32 seconds
Comment 29 Marat Radchenko 2009-09-20 12:57:08 UTC
Created attachment 204685 [details, diff]
Makes Atom inherit from str and increases Atom creation rate from 1.2k per second to 1.6k

Attached patch makes Atom inherit from str and increases Atom creation rate from 1.2k per second to 1.6k.

This eliminates the need in str methods in Atom.
Comment 30 Daniel Robbins 2009-09-20 18:29:32 UTC
Thanks very much for the Portage improvements, Marat! :) Keep up the good work and keep sending us improvements please :)
Comment 31 Zac Medico gentoo-dev 2009-09-20 19:35:39 UTC
(In reply to comment #28)
> Created an attachment (id=204673) [edit]
> Adds caching to module_wrapper

(In reply to comment #29)
> Created an attachment (id=204685) [edit]
> Makes Atom inherit from str and increases Atom creation rate from 1.2k per
> second to 1.6k

Thanks, those are in svn r14299 and r14300.
Comment 32 Marat Radchenko 2009-09-21 07:08:33 UTC
Created attachment 204770 [details, diff]
Simplify match_to_list down to single list comprehension

Attached patch simplifies match_to_list down to single list comprehension.
Comment 33 Zac Medico gentoo-dev 2009-09-21 15:29:43 UTC
(In reply to comment #32)
> Created an attachment (id=204770) [edit]
> Simplify match_to_list down to single list comprehension

Thanks, this is in svn r14325.
Comment 34 Marat Radchenko 2009-09-22 06:42:31 UTC
Created attachment 204883 [details, diff]
Optimizes unicode wrappers by avoiding redundant isinstance checks

Attached patch optimizes unicode wrappers by avoiding redundant isinstance checks.
Comment 35 Zac Medico gentoo-dev 2009-09-22 18:37:49 UTC
(In reply to comment #34)
> Created an attachment (id=204883) [edit]
> Optimizes unicode wrappers by avoiding redundant isinstance checks

Thanks, this is in svn r14376.
Comment 36 Marat Radchenko 2009-09-23 06:10:06 UTC
Created attachment 204996 [details, diff]
Improves vartree.getpath timing from 1.2 msec to 100 usec

Attached patch improves vartree.getpath timing from 1.2 msec to 100 usec. Such big difference is caused by unicode wrappers.
Comment 37 Zac Medico gentoo-dev 2009-09-23 06:36:23 UTC
(In reply to comment #36)
> Created an attachment (id=204996) [edit]
> Improves vartree.getpath timing from 1.2 msec to 100 usec

Thanks, that's in svn r14392.
Comment 38 Marat Radchenko 2009-09-23 18:20:46 UTC
Created attachment 205039 [details, diff]
Improves porttree.auxget timings from 11msec down to 5.8msec

Attached patch improves porttree.auxget timings from 11msec down to 5.8msec. This results in reducing 'emerge -vp paludis' from 30secs to 26.5secs
Comment 39 Zac Medico gentoo-dev 2009-09-24 05:49:02 UTC
(In reply to comment #38)
> Created an attachment (id=205039) [edit]
> Improves porttree.auxget timings from 11msec down to 5.8msec

Thanks, this is in svn r14398.
Comment 40 Zac Medico gentoo-dev 2009-10-11 00:55:38 UTC
This is fixed in 2.1.7.