]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cephadm: call compile_dir to byte compile zipapp py files 51650/head
authorJohn Mulligan <jmulligan@redhat.com>
Thu, 11 May 2023 18:20:41 +0000 (14:20 -0400)
committerAdam King <adking@redhat.com>
Sun, 21 May 2023 20:22:35 +0000 (16:22 -0400)
Python provides the compileall module to explicitly create pyc files
from py files. If we byte-compile the content of the cephadm zipapp
we get a small speed boost when running the application.

In a not-very-scientific benchmark I found that running with pyc files
almost halved the time to run the help command 50 times.

```
$ time for _ in {0..50}; do  /tmp/cephadm-nobc -h >/dev/null; done

real    0m9.486s
user    0m8.547s
sys     0m0.893s

$ time for _ in {0..50}; do  /tmp/cephadm-bc -h >/dev/null; done

real    0m4.634s
user    0m3.992s
sys     0m0.618s
```

I ran the above a few times on my laptop and the numbers are pretty
consistent.

One thing to note is that zipapp doesn't seem to understand the current
`__pycache__` approach to storing the bytecode files so we have to set
the `legacy` argument for compileall.compile_dir to true. Since
__pycache__ dirs mostly exist to allow multiple bytecode files for
different python versions to coexist, and a zipapp is read-only this
should not be a major issue. Tangentially related, we lose out on the
speedup if you run the zipapp with a version of python other than the
one the zipapp was built with but it continues to function.

Signed-off-by: John Mulligan <jmulligan@redhat.com>
(cherry picked from commit 06bed38931846749dba71ecbada5e3fe64b0dae2)

src/cephadm/build.py

index 4e97f5d37577fb5f7c976561c3634c63755c3d07..39c93ce3b3028d452491a549aa050f3711807923 100755 (executable)
@@ -6,6 +6,7 @@
 # of python to build with? Even with the intermediate cmake layer?
 
 import argparse
+import compileall
 import logging
 import os
 import pathlib
@@ -67,6 +68,14 @@ def _build(dest, src):
 
 def _compile(dest, tempdir):
     """Compile the zipapp."""
+    log.info("Byte-compiling py to pyc")
+    compileall.compile_dir(
+        tempdir,
+        maxlevels=16,
+        legacy=True,
+        quiet=1,
+        workers=0,
+    )
     # TODO we could explicitly pass a python version here
     log.info("Constructing the zipapp file")
     try: