[Python-Dev] Opcode cache in ceval loop (original) (raw)
Yury Selivanov yselivanov.ml at gmail.com
Tue Feb 2 14:23:10 EST 2016
- Previous message (by thread): [Python-Dev] Opcode cache in ceval loop
- Next message (by thread): [Python-Dev] Opcode cache in ceval loop
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On 2016-02-02 1:45 PM, Serhiy Storchaka wrote:
On 02.02.16 19:45, Yury Selivanov wrote:
On 2016-02-02 12:41 PM, Serhiy Storchaka wrote:
On 01.02.16 21:10, Yury Selivanov wrote:
To measure the max/average memory impact, I tuned my code to optimize every code object on first run. Then I ran the entire Python test suite. Python test suite + standard library both contain around 72395 code objects, which required 20Mb of memory for caches. The test process consumed around 400Mb of memory. Thus, the absolute worst case scenario, the overhead is about 5%.
Test process consumes such much memory because few tests creates huge objects. If exclude these tests (note that tests that requires more than 1Gb are already excluded by default) and tests that creates a number of threads (threads consume much memory too), the rest of tests needs less than 100Mb of memory. Absolute required minimum is about 25Mb. Thus, the absolute worst case scenario, the overhead is about 100%. Can you give me the exact configuration of tests (command line to run) that would only consume 25mb? I don't remember what exact tests consume the most of memory, but following tests are failed when run with less than 30Mb of memory: test_all testasynchat testasyncio testbz2 testcapi_ testconcurrentfutures testctypes testdecimal testdescr testdistutils testdocxmlrpc testeintr testemail testfork1 testfstring testftplib testfunctools testgc testgdb testhashlib testhttplib testhttpservers testidle testimaplib testimport testimportlib testio testitertools testjson testlib2to3 testlist testlogging testlongexp testlzma testmmap testmultiprocessingfork testmultiprocessingforkserver testmultiprocessingmainhandling testmultiprocessingspawn testos testpickle testpoplib testpydoc testqueue testregrtest testresource testrobotparser testshutil testsmtplib testsocket testsqlite testssl testsubprocess testtarfile testtcl testthread testthreadedimport testthreadedtempfile testthreading testthreadinglocal testthreadsignals testtix testtk testtools testttkguionly testttktextonly testtuple testunicode testurllib2localnet testwait3 testwait4 testxmlrpc testzipfile testzlib
Alright, I modified the code to optimize ALL code objects, and ran unit tests with the above tests excluded:
-- Max process mem (ru_maxrss) = 131858432 -- Opcode cache number of objects = 42109 -- Opcode cache total extra mem = 10901106
And asyncio tests:
-- Max process mem (ru_maxrss) = 57081856 -- Opcode cache number of objects = 4656 -- Opcode cache total extra mem = 1766681
So the absolute worst case for a small asyncio program is 3%, for unit tests (with the above list excluded) - 8%.
I think it'd be very hard to find a real-life program that consists of only code objects, and nothing else (no data to work with/process, no objects with dicts, no threads, basically nothing). Because only for such a program you would have a 100% memory overhead for the bytecode cache (when all code objects are optimized).
FWIW, here are stats for asyncio with only hot objects being optimized:
-- Max process mem (ru_maxrss) = 54775808 -- Opcode cache number of objects = 121 -- Opcode cache total extra mem = 43521
Yury
- Previous message (by thread): [Python-Dev] Opcode cache in ceval loop
- Next message (by thread): [Python-Dev] Opcode cache in ceval loop
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]