Утечка семафоров в сочетании с ошибкой HTTPConnectionPool - PullRequest
0 голосов
/ 24 сентября 2019

В настоящее время я работаю над исследовательским проектом, в котором используется SIFT для расчета сходства изображений примерно для 10 миллионов изображений.Из-за вычислительных затрат весь проект выполняется на внешнем сервере Debian GNU / Linux 10, точнее в кластере с 16 виртуальными ЦП и 128 ГБ ОЗУ.

Необходимые URL-адреса изображений для процесса компьютерного зрения (CV)хранится в том же кластере в томе и использует PostgreSQL 11.5 в качестве базы данных.Это означает, что изображения хранятся не локально, а скорее через Интернет (более подробно ниже).Весь вычислительный процесс для проекта занимает несколько дней.Моя проблема, которую я опишу в этом посте, возникает в среднем примерно через 24 часа работы.Моя программа работает в среде anaconda с Python 3.7.

Сообщение об ошибке выглядит следующим образом:

<MULTIPLE ERRORS AS BELOW>
HTTPConnectionPool(host='farm7.staticflickr.com', port=80): Max retries exceeded with url: /6082/6110723900_7fc58e8660.jpg (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fcba7ea0510>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))
CONNECTIONERROR - TRYING OTHER DNS REQUEST
google.com  is down!
HTTPConnectionPool(host='farm7.staticflickr.com', port=80): Max retries exceeded with url: /6205/6110739336_a87f44c2f2.jpg (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fca0f9fa110>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))
CONNECTIONERROR - TRYING OTHER DNS REQUEST
google.com  is down!
HTTPConnectionPool(host='farm9.staticflickr.com', port=80): Max retries exceeded with url: /8224/8439000558_5cd88ce128.jpg (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fcab0e6f210>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))/home/debian/anaconda/envs/myenv/lib/python3.7/site-packages/joblib/externals/loky/backend/semaphore_tracker.py:198: UserWarning: semaphore_tracker: There appear to be 6 leaked semaphores to clean up at shutdown
  len(cache))

Ошибка всегда возникает в одной и той же части кода.А именно, где программа извлекает все изображения определенной «группы» (это кластер HDBSCAN).Ошибка semaphore_tracker.py в большинстве случаев предшествует сотням видимых ошибок HTTPConnectionPool, которые связаны с ошибками разрешения имен.Строка " google.com недоступна! " позволила мне разобраться в проблеме, попытавшись проверить, не было ли разрешение DNS-имени некорректным для моего целевого домена или вообще, например, для Google.,Как видно из журнала ошибок, невозможно установить соединение ни с Google, ни с моим изображением URL farm9.staticflickr.com / IMAGE_PATH на тот момент времени.Это наблюдение также устранило мою первую мысль о том, что я, возможно, превысил разрешенную квоту на целевой сервер, на котором хранились все изображения и к которому я сделал тысячи запросов.

Код, который обрабатывает мои сеансы в его основном видекак следующий

Фрагмент кода обработки сеанса:

        with requests.Session() as session:
            session.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"}            
            retry = Retry(total=3, read=3, connect=3, backoff_factor=1)
            adapter = HTTPAdapter(max_retries=retry)
            session.mount('http://', adapter)
            session.mount('https://', adapter)            
            requests.packages.urllib3.disable_warnings()  # turn off SSL warnings

            <CODE TO ACQUIRE TARGET_URL HERE>

            content = session.get(target_url, verify=False)
            content.raise_for_status()
            content = content.content
            image = np.asarray(bytearray(content), dtype="uint8")
            image = cv2.imdecode(image, cv2.IMREAD_GRAYSCALE) #decodes image into bytes
            return image

Поскольку программа аварийно завершает работу только после упомянутого длительного времени выполнения, я подумал, что программа может открыться для многих сеансов или аналогичных;некоторые проблемы, связанные с сетью.Возможно, проблема также на стороне кластера / сервера в отношении используемого DNS-сервера.Парень, с которым я консультировался, сообщил мне, что используется внутренний DNS-сервер организации, а не публичный.Насколько мне известно, семафоры в основном связаны с многопроцессорностью, которую я не активно реализовывал в своем скрипте.Кроме того, я одновременно запустил журнал ОЗУ, который показал, что ОЗУ никогда не было проблемой во время сбоя, вызывающего ошибку.

Пожалуйста, помогите!

Среда Conda:

# Name                    Version                   Build  Channel
_libgcc_mutex             0.1                        main
beautifulsoup4            4.8.0                    py37_0
blas                      1.0                         mkl
bzip2                     1.0.8                h516909a_0    conda-forge
ca-certificates           2019.5.15                     1
cairo                     1.14.12              h8948797_3
certifi                   2019.6.16                py37_1
chardet                   3.0.4                    pypi_0    pypi
cycler                    0.10.0                   py37_0
dbus                      1.13.6               h746ee38_0
expat                     2.2.6                he6710b0_0
ffmpeg                    4.0                  hcdf2ecd_0
flickrapi                 2.4.0                    pypi_0    pypi
fontconfig                2.13.0               h9420a91_0
freeglut                  3.0.0             hf484d3e_1005    conda-forge
freetype                  2.9.1                h8a8886c_1
glib                      2.56.2               hd408876_0
graphite2                 1.3.13            hf484d3e_1000    conda-forge
gst-plugins-base          1.14.0               hbbd80ab_1
gstreamer                 1.14.0               hb453b48_1
harfbuzz                  1.9.0             he243708_1001    conda-forge
hdbscan                   0.8.22           py37hd352d35_1    conda-forge
hdf5                      1.10.2               hc401514_3    conda-forge
icu                       58.2                 h9c2bf20_1
idna                      2.8                      pypi_0    pypi
intel-openmp              2019.4                      243
jasper                    2.0.14               h07fcdf6_1
joblib                    0.13.2                     py_0    conda-forge
jpeg                      9b                   h024ee3a_2
kiwisolver                1.1.0            py37he6710b0_0
krb5                      1.16.1               h173b8e3_7
libedit                   3.1.20181209         hc058e9b_0
libffi                    3.2.1                hd88cf55_4
libgcc-ng                 9.1.0                hdf63c60_0
libgfortran               3.0.0                         1    conda-forge
libgfortran-ng            7.3.0                hdf63c60_0
libglu                    9.0.0             hf484d3e_1000    conda-forge
libopencv                 3.4.2                hb342d67_1
libopus                   1.3                  h7b6447c_0
libpng                    1.6.37               hbc83047_0
libpq                     11.2                 h20c2e04_0
libstdcxx-ng              9.1.0                hdf63c60_0
libtiff                   4.0.9                he6b73bb_1    conda-forge
libuuid                   1.0.3                h1bed415_2
libvpx                    1.7.0                h439df22_0
libxcb                    1.13                 h1bed415_1
libxml2                   2.9.9                hea5a465_1
matplotlib                3.1.0            py37h5429711_0
mkl                       2019.4                      243
mkl-service               2.0.2            py37h7b6447c_0
mkl_fft                   1.0.14           py37ha843d7b_0
mkl_random                1.0.2            py37hd81dba3_0
ncurses                   6.1                  he6710b0_1
numpy                     1.16.4           py37h7e9f1db_0
numpy-base                1.16.4           py37hde5b4d6_0
oauthlib                  3.1.0                    pypi_0    pypi
opencv                    3.4.2            py37h6fd60c2_1
openssl                   1.1.1c               h7b6447c_1
pandas                    0.25.0           py37he6710b0_0
pcre                      8.43                 he6710b0_0
pip                       19.2.2                   py37_0
pixman                    0.38.0            h516909a_1003    conda-forge
postgresql                11.2                 h20c2e04_0
psycopg2                  2.7.6.1          py37h1ba5d50_0
py-opencv                 3.4.2            py37hb342d67_1
pyparsing                 2.4.2                      py_0
pyqt                      5.9.2            py37h05f1152_2
python                    3.7.4                h265db76_1
python-dateutil           2.8.0                    py37_0
pytz                      2019.2                     py_0
qt                        5.9.7                h5867ecd_1
readline                  7.0                  h7b6447c_5
requests                  2.22.0                   pypi_0    pypi
requests-oauthlib         1.2.0                    pypi_0    pypi
requests-toolbelt         0.9.1                    pypi_0    pypi
scikit-learn              0.21.2           py37hd81dba3_0
scipy                     1.3.1            py37h7c811a0_0
setuptools                41.0.1                   py37_0
sip                       4.19.8           py37hf484d3e_0
six                       1.12.0                   py37_0
soupsieve                 1.9.2                    py37_0
sqlite                    3.29.0               h7b6447c_0
tk                        8.6.8                hbc83047_0
tornado                   6.0.3            py37h7b6447c_0
urllib3                   1.25.3                   pypi_0    pypi
wheel                     0.33.4                   py37_0
xorg-fixesproto           5.0               h14c3975_1002    conda-forge
xorg-inputproto           2.3.2             h14c3975_1002    conda-forge
xorg-kbproto              1.0.7             h14c3975_1002    conda-forge
xorg-libx11               1.6.8                h516909a_0    conda-forge
xorg-libxau               1.0.9                h14c3975_0    conda-forge
xorg-libxext              1.3.4                h516909a_0    conda-forge
xorg-libxfixes            5.0.3             h516909a_1004    conda-forge
xorg-libxi                1.7.10               h516909a_0    conda-forge
xorg-xextproto            7.3.0             h14c3975_1002    conda-forge
xorg-xproto               7.0.31            h14c3975_1007    conda-forge
xz                        5.2.4                h14c3975_4
zlib                      1.2.11               h7b6447c_3
...