zhuyifei1999 created this task.
zhuyifei1999 added a project: Pywikibot.
Restricted Application added subscribers: pywikibot-bugs-list, Aklapper.
TASK DESCRIPTION
BasePage.botMayEdit is annotated with `@cache`
@cache
def botMayEdit(self) -> bool:
This is an unbounded strongref cache, so whenever `botMayEdit` is called,
`self` will be added to the cache as key, and the key will never be deleted
from cache. The `self` will then go on to reference way too many objects and
keeping them alive. One of my long-running bots used up 4 gigabytes of memory
before hitting rlimit and getting killed.
I tested that script with guppy3 to visualize just how much is being kept
alive by botMayEdit cache: (`dominos` is "The set 'dominated' by the set of
objects in x. This is the objects that will become deallocated, directly or
indirectly, when the objects in x are deallocated.")
When the bot first starts:
>>> import guppy
>>> hp = guppy.hpy()
>>> hp.heap()
Partition of a set of 270151 objects. Total size = 32191012 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 114602 42 9772353 30 9772353 30 str
1 10927 4 5288952 16 15061305 47 dict (no owner)
2 42074 16 4030904 13 19092209 59 tuple
3 20385 8 1538948 5 20631157 64 bytes
4 1565 1 1524032 5 22155189 69 type
5 10142 4 1464520 5 23619709 73 types.CodeType
6 9655 4 1390320 4 25010029 78 function
7 27941 10 796952 2 25806981 80 int
8 1565 1 790760 2 26597741 83 dict of type
9 5001 2 690752 2 27288493 85 list
<552 more rows. Type e.g. '_.more' to view.>
>>> hp.iso(pywikibot.page.BasePage.botMayEdit).dominos
Partition of a set of 11848 objects. Total size = 1652473 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 2474 21 752160 46 752160 46 dict (no owner)
1 6271 53 498823 30 1250983 76 str
2 1145 10 95872 6 1346855 82 list
3 150 1 64576 4 1411431 85 collections.OrderedDict
4 146 1 56016 3 1467447 89 dict of pywikibot.page.Page
5 193 2 42328 3 1509775 91 dict of pywikibot.page.Link
6 158 1 36656 2 1546431 94 set
7 85 1 21080 1 1567511 95 dict of pywikibot.page.Claim
8 265 2 19480 1 1586991 96 tuple
9 46 0 13040 1 1600031 97 dict of pywikibot.page.ItemPage
<28 more rows. Type e.g. '_.more' to view.>
>>> pywikibot.page.BasePage.botMayEdit.cache_info()
CacheInfo(hits=0, misses=5, maxsize=None, currsize=5)
After running for a few minutes:
>>> hp.heap()
Partition of a set of 1603419 objects. Total size = 208454157 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 230842 14 71763136 34 71763136 34 dict (no owner)
1 840630 52 60144617 29 131907753 63 str
2 129444 8 13086752 6 144994505 70 list
3 36258 2 13024648 6 158019153 76 collections.OrderedDict
4 19909 1 7455544 4 165474697 79 dict of pywikibot.page.Link
5 28394 2 7041712 3 172516409 83 dict of pywikibot.page.Claim
6 52982 3 4815056 2 177331465 85 tuple
7 12188 1 3108712 1 180440177 87 dict of pywikibot.page.ItemPage
8 7112 0 2737112 1 183177289 88 dict of pywikibot.page.Page
9 8177 1 2124904 1 185302193 89 set
<557 more rows. Type e.g. '_.more' to view.>
>>> hp.iso(pywikibot.page.BasePage.botMayEdit).dominos
Partition of a set of 1049673 objects. Total size = 141565142 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 193668 18 53690232 38 53690232 38 dict (no owner)
1 500122 48 33602128 24 87292360 62 str
2 35999 3 12842600 9 100134960 71 collections.OrderedDict
3 115539 11 10840032 8 110974992 78 list
4 19908 2 7455168 5 118430160 84 dict of pywikibot.page.Link
5 28394 3 7041712 5 125471872 89 dict of pywikibot.page.Claim
6 12188 1 3108712 2 128580584 91 dict of pywikibot.page.ItemPage
7 7111 1 2736736 2 131317320 93 dict of pywikibot.page.Page
8 28394 3 1817216 1 133134536 94 pywikibot.page.Claim
9 7567 1 1755544 1 134890080 95 set
<42 more rows. Type e.g. '_.more' to view.>
>>> pywikibot.page.BasePage.botMayEdit.cache_info()
CacheInfo(hits=0, misses=225, maxsize=None, currsize=225)
This is since rPWBC8b952048ab61: [bugfix] cache botMayEdit result
<https://phabricator.wikimedia.org/rPWBC8b952048ab61cbc2b78edf9ff647a5fcd1f1f535>
/ T267770: wikibase_tests fails for TestLoadRevisionsCaching.test_page_text
<https://phabricator.wikimedia.org/T267770>
TASK DETAIL
https://phabricator.wikimedia.org/T283957
EMAIL PREFERENCES
https://phabricator.wikimedia.org/settings/panel/emailpreferences/
To: zhuyifei1999
Cc: Aklapper, pywikibot-bugs-list, Xqt, zhuyifei1999, Shalomori123, Jyoo1011,
JohnsonLee01, SHEKH, Dijkstra, Khutuck, Zkhalido, Viztor, Wenyi, Tbscho, MayS,
Mdupont, JJMC89, Dvorapa, Altostratus, Avicennasis, mys_721tx, jayvdb, Masti,
Alchimista
_______________________________________________
pywikibot-bugs mailing list -- [email protected]
To unsubscribe send an email to [email protected]