Estoy tratando de diagnosticar un problema de rendimiento con el servidor creado por multiprocessing.managers.BaseManager . El problema se reduce a esto:
server.py :
import multiprocessing import multiprocessing.managers auth_key = b'12345678901234567890' port = 32001 shared_values = {} def _shared_values(): global shared_values return shared_values class SharedStateManager(multiprocessing.managers.BaseManager): pass SharedStateManager.register('SharedValues', callable=_shared_values) multiprocessing.current_process().authkey = auth_key server = SharedStateManager(address=('', port), authkey=auth_key) server.get_server().serve_forever() client.py :
import time import multiprocessing import multiprocessing.managers auth_key = b'12345678901234567890' port = 32001 class SharedStateManager(multiprocessing.managers.BaseManager): pass SharedStateManager.register('SharedValues') multiprocessing.current_process().authkey = auth_key ssm = SharedStateManager(address=('', port), authkey=auth_key) cl1 = time.time_ns() ssm.connect() cl2 = time.time_ns() shared_values = ssm.SharedValues() cl3 = time.time_ns() print('2-1: {} ms'.format((cl2 - cl1) / (10 ** 6))) print('3-2: {} ms'.format((cl3 - cl2) / (10 ** 6)))Cuando ejecuto el código del cliente en una instancia de Debian buster que se ejecuta en Intel 8th-gen 2.3GHz i5 con 4 núcleos, obtengo:
2-1: 42.124515 ms 3-2: 132.311978 msQue es muy lento. La versión de Python es 3.7.3, aunque probé una versión diferente con contenedores docker y obtuve resultados similares.
Pero si ejecuto el mismo código en una Macbook (macos 11.6) que tiene una CPU similar, obtengo:
2-1: 1.950359 ms 3-2: 3.264376 ms¿Cuál podría ser la causa de una diferencia de tiempo de respuesta tan dramática?
Editar: la máquina de destino no está rota ni nada. Está ejecutando un par de máquinas virtuales QEMU más algunos contenedores docker. Hasta ahora, la latencia de la red no ocurrió, por ejemplo, en un servidor HTTP basado en Sanic u otros servidores de socket en contenedores. Copiar un archivo a través de un recurso compartido de red maximizará la LAN a aproximadamente 100 MB/s. Así que le está pasando al servidor de multiprocesamiento de Python en particular.
Editar: también encontré esta pregunta que exhibió el mismo comportamiento con respecto a un programa de multiprocesamiento de Python que se ejecuta mucho más rápido en Mac que en Linux.
Edito: ¡Resuelto! Pensé que estaba ejecutando Debian bullseye, pero resultó que estaba ejecutando buster. Después de agotar todas las demás opciones, probé la actualización de versión. Y la latencia desapareció después de la actualización.