Я недавно начал использовать ZeroMQ и заметил, что иногда инициализация контекста ZeroMQ может занимать до 40 секунд . Обычно это намного быстрее, чем это.
Например:
import zmq
# the next line will sometimes take 40 seconds
# or so but is usually near instantaneous
with zmq.Context.instance() as context:
# connect / bind to socket, do stuff
pass
Такое поведение не зависит от того, использую я менеджер контекста или нет, например, следующие действия ведут себя так же, как указано выше:
import zmq
# the next line will sometimes take 40 seconds
# or so but is usually near instantaneous
context = zmq.Context.instance()
# connect / bind to socket, do stuff
context.term()
Это работает в Python 3.6.8 в Ubuntu 18.04.2
Мне не удалось установить sh какой-либо шаблон для замедлений.
Каковы возможные причины такого поведения?
Обновление
По предложению @ user3666197, я взял несколько таймингов и сумел заставить замедление проявиться во втором запуске. После этого все вернулось к «нормальному».
При втором запуске тестового сценария началось замедление:
= zmq.Context()] took + 704 [us] to execute
1.~ 704 us
2.~ 131 766 816 us
3.~ 145 us
4.~ 137 us
Просмотр памяти на htop
в то время не показывал память Заполнение вообще, но своп уже был активен.
Обновление 2
Использование сокращенной версии предложенного сценария @ user3666197:
import sys
import zmq
clock = zmq.Stopwatch()
clock.start()
foo = zmq.Context()
bar = clock.stop()
print("{0:>2s}: {1:>9d}".format(sys.argv[1], bar))
foo.term()
И вызов его на всех oop, например:
for x in $(seq 1 20);
do python3 test.zmq.py $x;
done
Я могу повторить проблему на исходном сервере , но мне еще не удалось обнаружить ее на другом сервере , что предполагает проблема (или что-то связанное с указанием c версии для дистрибутива и / или python версии, так как «хороший» сервер устарел).
Пока этого достаточно, но я вернусь к это позже и собрать достаточно информации, чтобы представить что-то сопровождающим.