Это будет довольно длинный пост с подробным описанием моих проблем и результатов моего исследования на данный момент.
Контекст:
В настоящее время у меня есть Rundeck насервер GCP с запущенными на нем скриптами Python.Сценарии Python используются для взаимодействия с другими службами с помощью rest-API.
Проблема:
Эти сценарии работают хорошо и быстро (менее 20 секунд), но иногда это занимает 4или 5 минут, чтобы бежать.Эта проблема встречается в каждом скрипте.
Когда происходит медленный сценарий, он касается каждого сценария за период времени:
Script9 20/03/2019 16:50 en 3 s
Script8 20/03/2019 16:49 en 4 m50 s
Script7 20/03/2019 16:49 en 4 m45 s
Script5 20/03/2019 16:49 en 4 m43 s
Script4 20/03/2019 16:49 en 4 m33 s
Script3 20/03/2019 16:48 en 2 m1 s
Script2 20/03/2019 16:48 en 2 m1 s
Script1 20/03/2019 16:48 en 2 m1 s
Script8 20/03/2019 16:44 en 3 s
Чтобы получить больше информации о том, что замедляет выполнение сценария, я сделал -m cProfile -s tottime
и это показывает, что самой медленной функцией является {built-in method _openssl.ENGINE_init}
cProfile result
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
1 216.560 216.560 216.560 216.560 {built-in method _openssl.ENGINE_init}
1 10.005 10.005 10.005 10.005 {built-in method time.sleep}
43 2.121 0.049 2.121 0.049 {method 'read' of '_ssl._SSLSocket' objects}
12 0.449 0.037 0.449 0.037 {method 'do_handshake' of '_ssl._SSLSocket' objects}
488 0.267 0.001 0.267 0.001 {built-in method marshal.loads}
18 0.206 0.011 0.206 0.011 {method 'connect' of '_socket.socket' objects}
12 0.110 0.009 0.110 0.009 {method 'load_verify_locations' of '_ssl._SSLContext' objects}
18 0.064 0.004 0.064 0.004 {built-in method _socket.getaddrinfo}
1630/1617 0.045 0.000 0.154 0.000 {built-in method builtins.__build_class__}
3799 0.041 0.000 0.041 0.000 {built-in method posix.stat}
529/1 0.035 0.000 230.937 230.937 {built-in method builtins.exec}
Похоже, что проблема возникла из _openssl, используемого библиотекой запросов.
Что я пробовал:
Чтобы решить эту проблему, я посмотрел в Google и не нашел ничего, что решало бы мою проблему.Я пробовал несколько вещей:
- Обновление сервера GCP (новая конфигурация в другой информации)
- Обновление памяти JVM рабочей среды
- Изменение секунд на заданияхвремя, чтобы избежать запуска скрипта в ту же секунду
- Наблюдение за рабочей средой и обнаружение увеличения tcp_time_wait при возникновении проблемыэта проблема.
Я также пытался воспроизвести проблему вручную, но даже когда я параллельно запускаю несколько сценариев из rundeck, проблема не появляется.
Ваше время сиять:
Если вы уже столкнулись с этой проблемой или у вас есть идея, что я могу попробовать, пожалуйста, дайте мне знать.
Спасибо, что прочитали это.
Другая информация:
Запуск сценариев запуска с использованием задания с этим:
#!/bin/bash
set -e
source /root/venv/global/bin/activate
export PYTHONPATH=${PYTHONPATH}:/root/repo/Script
python /root/repo/Script/folder/scriptname.py
deactivate
Библиотеки Python (3.5) и их версии в venv:
argh==0.26.2
asn1crypto==0.24.0
bcrypt==3.1.6
cachetools==3.0.0
certifi==2018.11.29
cffi==1.11.5
chardet==3.0.4
Click==7.0
cryptography==2.5
Deprecated==1.2.4
emoji==0.5.1
et-xmlfile==1.0.1
future==0.17.1
get==2018.11.19
google-api-core==1.7.0
google-api-python-client==1.7.7
google-auth==1.6.2
google-auth-httplib2==0.0.3
google-cloud-core==0.29.1
google-cloud-logging==1.10.0
googleapis-common-protos==1.5.6
grpcio==1.18.0
httplib2==0.12.0
idna==2.8
jdcal==1.4
mysql-connector==2.1.4
numpy==1.16.0
oauth2client==4.1.3
openpyxl==2.5.14
pandas==0.23.4
paramiko==2.4.2
pathtools==0.1.2
Pillow==5.4.1
post==2018.11.20
protobuf==3.6.1
public==2018.11.20
pyasn1==0.4.5
pyasn1-modules==0.2.3
pycparser==2.19
PyGithub==1.43.4
PyJWT==1.7.1
PyNaCl==1.3.0
pyodbc==4.0.25
python-dateutil==2.7.5
python-resize-image==1.1.18
pytz==2018.9
PyYAML==3.13
query-string==2018.11.20
request==2018.11.20
requests==2.21.0
rsa==4.0
salesforce-bulk-api==1.2.0
simple-salesforce==0.74.2
six==1.12.0
unicodecsv==0.14.1
uritemplate==3.0.0
urllib3==1.24.1
watchdog==0.9.0
wrapt==1.11.1
xmltodict==0.11.0
GCP serveur config:
- имя: n1-standard-4
- vCPU: 4
- Память: 15
- Макс. Числопостоянные диски: 128
- Максимальный общий размер PD: 64