У меня слишком много проблем с открытыми файлами при распространении Tornado и Dask.
Чтобы смоделировать то, с чем я сталкиваюсь, следующий код:
import time
from concurrent.futures._base import CancelledError
from distributed import Client, as_completed
import dask
import numpy as np
client_url = 'x.x.x.x:port' # replace with ur dask distributed cluster. I started with 1 process and 16 threads
client = Client(client_url)
cols = ['id', 'name', 'x', 'y'] * 1000
df = dask.datasets.timeseries()
def some_py_fn(col_name):
# simulating pure python operation
time.sleep(2)
np.correlate([1, 2, 3], [0, 1, 0.5]) #just for the sake of it
return df[col_name].count().compute()
for i in range(100):
print(i)
futures = client.map(some_py_fn, cols)
for batch in as_completed(futures, with_results=True, raise_errors=False).batches():
for _, result in batch:
if isinstance(result, CancelledError):
raise CancelledError()
count = result
del result
del df
client.close()
Что происходит:
Dask продолжает открывать новые файлы, включая сокеты. В данном случае, для меня система начала примерно с 5 тыс. Открытых файлов до 18071 г., в конце операции 1096 из которых являются сокетами.
При сложных операциях одна за другой это просто взрывается. Я изо всех сил стараюсь симулировать то же самое здесь. Несмотря на то, что количество открытых файлов здесь относительно невелико, проблема, с которой я сталкиваюсь, - это открытые файлы порядка - 3878443
. Таким образом, создание неограниченного количества открытых файлов на самом деле не является решением.
Кроме того, многое из того, что открывает dask, это socket
, и оно не закрывается после запуска. Трудно предсказать, когда он откроет новый сокет, но примерно 40% из вышеуказанного числа были сокетами. Dask также открывает один и тот же файл библиотеки несколько раз. Вот образец из вышеупомянутого маленького пробега.
dask-sche 18342 ec2-user mem REG 259,3 1359260 51824178 /home/ec2-user/kenv/lib/python3.6/site-packages/numpy/random/common.cpython-36m-x86_64-linux-gnu.so
dask-sche 18342 18361 ec2-user mem REG 259,3 1359260 51824178 /home/ec2-user/kenv/lib/python3.6/site-packages/numpy/random/common.cpython-36m-x86_64-linux-gnu.so
dask-sche 18342 18501 ec2-user mem REG 259,3 1359260 51824178 /home/ec2-user/kenv/lib/python3.6/site-packages/numpy/random/common.cpython-36m-x86_64-linux-gnu.so
dask-sche 18342 18502 ec2-user mem REG 259,3 1359260 51824178 /home/ec2-user/kenv/lib/python3.6/site-packages/numpy/random/common.cpython-36m-x86_64-linux-gnu.so
dask-work 18366 ec2-user mem REG 259,3 1359260 51824178 /home/ec2-user/kenv/lib/python3.6/site-packages/numpy/random/common.cpython-36m-x86_64-linux-gnu.so
dask-work 18366 18383 ec2-user mem REG 259,3 1359260 51824178 /home/ec2-user/kenv/lib/python3.6/site-packages/numpy/random/common.cpython-36m-x86_64-linux-gnu.so
dask-work 18366 18385 ec2-user mem REG 259,3 1359260 51824178 /home/ec2-user/kenv/lib/python3.6/site-packages/numpy/random/common.cpython-36m-x86_64-linux-gnu.so
dask-work 18366 18404 ec2-user mem REG 259,3 1359260 51824178 /home/ec2-user/kenv/lib/python3.6/site-packages/numpy/random/common.cpython-36m-x86_64-linux-gnu.so
Количество открытых файлов постоянно увеличивается. Дайте мне знать, как уменьшить количество подключений к сокету и многократное открытие одних и тех же файлов.
Env:
Tornado - 5.1.1
distributed - 2.9.3
dask - 2.9.2