Форум сайта python.su
0
Попробовал уйти от потоков (из-за 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. Просьба не указывать на асинхронные фреймворки и не рассматривать их в данном топике.
Офлайн
0
Надо еще учитывать сетевой пулл, в моем случае пришлось использовать асинхроные решения с процессами. Кстати чтоб не дергать днс я накатал парсер и добавляю его в hosts перед парсингом. Количество ограниченых сокетов в линуксе ulimit -n.
Отредактировано chudoff_a (Янв. 11, 2013 04:37:00)
Офлайн
0
chudoff_aДля root пользователя ulimit равно unlimited.
ulimit -n
chudoff_a1м сайтов в hosts не добавишь. Можно иначе, но не об этом сейчас речь.
Кстати чтоб не дергать днс я накатал парсер и добавляю его в hosts
Офлайн
32
DHTЗначит нет смысла их столько запускать, скорее “висит” сеть.
200, и 30 процессов работают одинаково и практически не грузят процессор
DHTС такой же производительностью будет работать и 1 асинхронный процесс.
200, и 30 процессов работают одинаково
chudoff_aДля этого можно локально поднять dns сервер и настроить кеширование.
Кстати чтоб не дергать днс я накатал парсер и добавляю его в hosts перед парсингом.
Офлайн
0
o7412369815963Канал грузится не более чем на 3 процента. Процессы запрашивают только IP адреса домена:
В данном случае (судя по доступной информации и догадках) основной тормоз - сеть
socket.getaddrinfo(...)
o7412369815963Это при математических вычислениях и т.п., но не в данном случае. Потоки тоже не вариант, т.к. getaddrinfo блокирующая сокет операция (простите если изъясняюсь технически не правильно).
По хорошему дополнительные процессы нужны когда уже запущенный процесс грузит ядро на 100%.
DHTя же просил не сводить обсуждение к этому )
поэтому тут лучше использовать асинхронную обработку, либо coroutine (gevent)
Офлайн
32
DHTНаоборот, можно сказать, потоки как раз для блокирующих операций.
Потоки тоже не вариант, т.к. getaddrinfo блокирующая сокет операция
DHTИ зря.
DHT
поэтому тут лучше использовать асинхронную обработку, либо coroutine (gevent)
я же просил не сводить обсуждение к этому )
Офлайн
0
o7412369815963Под windows ни один из этих фреймворков не показывает таких хороших результатов. К тому же я не вижу как можно организовать цепочку POST/GET запросов через SOCKS прокси используя gevent и co.
Сейчас попробовал на gevent - в один поток за секунду возвращается 1000 записей (getaddrinfo).
o7412369815963Не зря. Просто это вопрос уже обсуждался и не вижу смысла повторяться. Топик ведь имеет вполне конкретную тему.
И зря.
Офлайн
32
DHThttp://stackoverflow.com/questions/2317849/how-can-i-use-a-socks-4-5-proxy-with-urllib2
К тому же я не вижу как можно организовать цепочку POST/GET запросов через SOCKS прокси используя gevent и co.
DHT1500 адресов, 1000 загружается за 1 сек, канал скачет от 1Мбит до 5Мбит(100%), + есть задежка от сервера (днс).
какая во время проведенного вами теста была нагрузка на сервере: процессор, канал. Все ли адреса были уникальными, а не список вида * 1000 ?
o7412369815963 на сервере стоит лимит[/quote
дайте кусок списка доменов, 100К где-нибудь, завтра если будет время протестирую на hetzner'e
Офлайн