Найти - Пользователи
Полная версия: Что ограничивает кол-во процессов в Python? (разные результаты под Win и Linux)
Начало » Python для новичков » Что ограничивает кол-во процессов в Python? (разные результаты под Win и Linux)
1
DHT
Попробовал уйти от потоков (из-за GIL) и экспериента ради попробовал multiprocessing.

Задача:
пройтись по базе в 1 миллион адресов и собрать нужные данные.

На сервере с Win Server 2003 (2,4GHz и 896 RAM) получается создать max 120 процессов (я понимаю, что процессы больше для многопроцессорных систем, но что поделаешь). Создать больше не могу из-за нехватки памяти (т.к. около 6Мб памяти уходит на 1 процесс). Создаются процессы крайне медленно: 100 процессов за 20 секунд где-то.

На сервере с Win Server 2003 (4 ядерный проц и 8GB RAM) процессы запускаются моментально, но 500 процессов работают почти также как 120 на более слабом сервере. Что-то тормозит процессы/переключения между ними?

На Linux сервере с Centos (Intel G6950 2.8GHz 2GB RAM) процессы также создаются быстро. Весят крайне мало (меньше 1 мегабайта), но и 200, и 30 процессов работают одинаково и практически не грузят процессор. Что их ограничивает на Linux (доступ из под root)?

Также интересно сколько нормально работающих потоков на C++ для работы с тем же libcurl я смогу запустить на первом сервере: Win Server 2003 (2,4GHz и 896 RAM)?

Попробовал PyPy 1.9, так там процессы и вовсе по 25 метров весят, а запускаются в раза 3 дольше.

p.s. Просьба не указывать на асинхронные фреймворки и не рассматривать их в данном топике.
chudoff_a
Надо еще учитывать сетевой пулл, в моем случае пришлось использовать асинхроные решения с процессами. Кстати чтоб не дергать днс я накатал парсер и добавляю его в hosts перед парсингом. Количество ограниченых сокетов в линуксе ulimit -n.
DHT
chudoff_a
ulimit -n
Для root пользователя ulimit равно unlimited.

chudoff_a
Кстати чтоб не дергать днс я накатал парсер и добавляю его в hosts
1м сайтов в hosts не добавишь. Можно иначе, но не об этом сейчас речь.
o7412369815963
DHT
200, и 30 процессов работают одинаково и практически не грузят процессор
Значит нет смысла их столько запускать, скорее “висит” сеть.
По хорошему дополнительные процессы нужны когда уже запущенный процесс грузит ядро на 100%.
В данном случае (судя по доступной информации и догадках) основной тормоз - сеть, поэтому тут лучше использовать асинхронную обработку, либо coroutine (gevent), на крайний случай потоки.

DHT
200, и 30 процессов работают одинаково
С такой же производительностью будет работать и 1 асинхронный процесс.

chudoff_a
Кстати чтоб не дергать днс я накатал парсер и добавляю его в hosts перед парсингом.
Для этого можно локально поднять dns сервер и настроить кеширование.
DHT
o7412369815963
В данном случае (судя по доступной информации и догадках) основной тормоз - сеть
Канал грузится не более чем на 3 процента. Процессы запрашивают только IP адреса домена:
socket.getaddrinfo(...)

o7412369815963
По хорошему дополнительные процессы нужны когда уже запущенный процесс грузит ядро на 100%.
Это при математических вычислениях и т.п., но не в данном случае. Потоки тоже не вариант, т.к. getaddrinfo блокирующая сокет операция (простите если изъясняюсь технически не правильно).

DHT
поэтому тут лучше использовать асинхронную обработку, либо coroutine (gevent)
я же просил не сводить обсуждение к этому )
o7412369815963
DHT
Потоки тоже не вариант, т.к. getaddrinfo блокирующая сокет операция
Наоборот, можно сказать, потоки как раз для блокирующих операций.

Сейчас попробовал на gevent - в один поток за секунду возвращается 1000 записей (getaddrinfo).
А дальше похоже на сервере стоит лимит, нужно проверять, у меня нет большого списка хостов. С такой скоростью 1М хостов обработается за 16мин, не так уж и долго.

DHT
DHT
поэтому тут лучше использовать асинхронную обработку, либо coroutine (gevent)
я же просил не сводить обсуждение к этому )
И зря.
DHT
o7412369815963
Сейчас попробовал на gevent - в один поток за секунду возвращается 1000 записей (getaddrinfo).
Под windows ни один из этих фреймворков не показывает таких хороших результатов. К тому же я не вижу как можно организовать цепочку POST/GET запросов через SOCKS прокси используя gevent и co.
o7412369815963
И зря.
Не зря. Просто это вопрос уже обсуждался и не вижу смысла повторяться. Топик ведь имеет вполне конкретную тему.


o7412369815963, вы можете подсказать какая во время проведенного вами теста была нагрузка на сервере: процессор, канал. Все ли адреса были уникальными, а не список вида * 1000 ?
Спасибо.
o7412369815963
DHT
К тому же я не вижу как можно организовать цепочку POST/GET запросов через SOCKS прокси используя gevent и co.
http://stackoverflow.com/questions/2317849/how-can-i-use-a-socks-4-5-proxy-with-urllib2
Да и post/get можно отдельным приложением пустить.

DHT
какая во время проведенного вами теста была нагрузка на сервере: процессор, канал. Все ли адреса были уникальными, а не список вида * 1000 ?
1500 адресов, 1000 загружается за 1 сек, канал скачет от 1Мбит до 5Мбит(100%), + есть задежка от сервера (днс).

Все это похоже на
o7412369815963 на сервере стоит лимит[/quote
дайте кусок списка доменов, 100К где-нибудь, завтра если будет время протестирую на hetzner'e
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB