LINUX.ORG.RU

Проблема с потоками.

 , , , ,


0

1

Всем привет. Есть сервер: Centos 6.6 \ 32 GB RAM \ 500 Mbit канал.

Задача: Хочу запустить многопоточный скрипт на php, который скачивает содержимое разных доменов.

Проблема: При увеличении количества потоков, производительность отдельного потока сильно падает - т.е. увеличивается время исполнения потока, а так же часть запросов вылетают по таймауту. Так же загрузка канала становится неравномерной. В итоге увеличение кол-ва потоков не дает прироста производительности, а только ухудшение качества конечного результата

Дебаг: При 10 потоках 1 поток исполняется 20 скунд При 20 потоках 1 поток исполняется 21 секунду При 50 потоках 1 поток исполняется 25 секунд При 100 потоках 1 поток исполняется от 50 до 110 секунд При 150 потоках от 50 до 150 секунд

Запускал так же аналогичные скрипты: - на Ruby - из командной строки при помощи curl и Get. Ситуация была аналогичной, до 50 потоков все ок, потом начинается невероятное.

Аналогичные операции проверялись на другом сервере с Centos 7, симптомы точно такие же.

Вопрос: Какие системные настройки можно подркрутить, что бы многопоточно можно было скачивать?

Содержимое ulimit -a =================================== core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 255955 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 500000 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 255955 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited ===================================

Sysctl =================================== net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 net.ipv6.conf.all.autoconf = 0 net.ipv6.conf.default.autoconf = 0 net.ipv6.conf.eth0.autoconf = 0 net.ipv6.conf.all.accept_ra = 0 net.ipv6.conf.default.accept_ra = 0 net.ipv6.conf.eth0.accept_ra = 0 fs.file-max = 2097152 fs.file-max = 500000 net.ipv4.ip_local_port_range = 10024 65000 net.core.somaxconn = 131072 net.ipv4.tcp_keepalive_time = 180 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_keepalive_intvl = 30 net.netfilter.nf_conntrack_max = 262144 net.netfilter.nf_conntrack_tcp_timeout_established = 28800 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 8388608 net.core.wmem_max = 8388608 net.core.netdev_max_backlog = 2000 net.ipv4.tcp_max_syn_backlog = 2048 ===================================

Заранее большое спасибо!

Наверное, вам нужно крутить net.ipv4.tcp_mem, net.ipv4.tcp_rmem, net.ipv4.tcp_wmem, при условии, что вы не перегружаете канал и не начинаются заметные потери пакетов. Что происходит с пингом при различном кол-ве потоков.

mky ★★★★★ ()
Ответ на: комментарий от mky

Спасибо за ответ.

Пинг как входящий так и исходящий остается без изменений вообще, даже на сотую ms.

Что касается загрузки канала, то по 30 потоках загрузка равномерная - 30 мегабит, при 200 потоках загрузка плавает от 15 до 120 мегабит, а средняя даже ниже чем 30 мегабит.

DonOso ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.