asyncio_websockets tests the implementation of `zlib`, not of Python
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 1k
- Forks
- 203
- Merge medio
- 1 h 20 min
- PR fusionados (30 d)
- 2
Descripción
I found out that the asyncio_websockets benchmark spends ~87% of runtime in zlib (i.e. in the shared library libz.so), or whatever compression library is the default on the system-under-test.
In other words, asyncio_websockets tests the implementation of compression/decompression algorithms rather than anything to do with the Python interpreter or the websockets Python module. Websockets indeed enables compression by default: https://websockets.readthedocs.io/en/stable/topics/compression.html, excerpt from that official documentation:
connect() and serve() enable compression by default because the reduction in network bandwidth is usually worth the additional memory and CPU cost.
Problem
I believe this benchmark may not be measuring what's intended in its current form. For example, a replacement of zlib with zlib-ng or zlib-rs (which are newer drop-in replacement of zlib) may significantly affect the performance score of this benchmark, even though nothing changed in Python and/or websockets implementations. It is hard to root cause such performance modification, without knowing this detail about the asyncio_websockets benchmark.
It is also used in e.g. Phoronix testing, which may lead to unexpected conclusions for readers who aren't aware of this detail. Example: https://www.phoronix.com/review/cachyos-ubuntu-2510-f43/5.
Solutions
I see the following solutions:
- Clearly document this behavior in https://pyperformance.readthedocs.io/benchmarks.html (in fact, there is no mention of websockets benchmark at all).
- Remove this benchmark, since the workload is dominated by native zlib rather than Python or websockets logic.
- Modify this benchmark to disable compression, as described here: https://websockets.readthedocs.io/en/stable/topics/compression.html#configuring-compression
I'd lean towards option 3 (disabling compression) as it preserves the benchmark's intent while removing the zlib dependency from results. I'm happy to submit a PR if the maintainers agree.
Reproducing
I ran it with a Amazon Linux 2023 docker container (OS distro similar to Fedora):
docker run --rm -it amazonlinux:2023 /bin/bash # -->
dnf install -y pip perf dnf-utils
dnf debuginfo-install zlib python3.9
python3 -m pip install pyperformance
python3 -m pip install websockets==11.0.3 pyperf==2.6.3
perf record -g --call-graph dwarf -- \
python3 -u /usr/local/lib/python3.9/site-packages/pyperformance/data-files/benchmarks/bm_asyncio_websockets/run_benchmark.py
After running the benchmark, we can examine the resulting perf.data file:
$ perf report --hierarchy
...
- 99.93% python3
- 87.22% libz.so.1.2.11
+ 40.11% [.] inflate_fast
+ 36.28% [.] deflate_slow
...
+ 5.20% libpython3.9.so.1.0
+ 1.60% libc.so.6
...
P.S. Thank you for maintaining the pyperformance project!
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza con pyperformance/data-files/benchmarks/bm_asyncio_websockets/run_benchmark.py y reproduce el perfil con perf para confirmar la proporción de zlib. Revisa las indicaciones enlazadas sobre la compresión de websockets y el punto de entrada de la documentación del benchmark. Se considera terminado cuando la resolución elegida por los maintainers esté implementada y el comportamiento de compresión del benchmark esté claramente documentado o excluido de la carga de trabajo medida.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- performance, testing-qa
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Activo
- Claridad
- Bastante claro
- Aptitud para principiantes
- 48/100