ufm: (Default)
[personal profile] ufm

Запускаем 100000 процессов, каждый из которых считает сумму чисел от 0 до 100000

Ну что… 52 секунды на эрланге супротив 2.2 на golang. Это, конечно, ожидаемо.

Но вот что в голанге «лёгкие процессы» — это они, конечно, гонят. Ибо попытка запустить на голанге 1 мульён проццессов привёл к выжиранию памяти и уходу машины в своп.

Ерланг, понятно дело, сделал этот мульён и особо не подавился. Причем 1000000 процессов считающих сумму от 0 до 10000 и 10 процессов, считающих сумму от 0 до 1000000000 колбасились примерно одно и тоже время. первый вариант 53 секунды, второй — 51.

Originally published at U.F.M's Homepage. You can comment here or there.

(no subject)

Date: 2014-04-19 10:09 (UTC)
From: [identity profile] dil.livejournal.com
А что это у тебя за операционка, где можно запустить мульён или хотя бы стотыщ _процессов_?

(no subject)

Date: 2014-04-19 10:16 (UTC)
From: [identity profile] -oxpa-.livejournal.com
echo 4194403 > /proc/sys/kernel/pid_max
Хоть 4.

also, это процессы внутри виртуальной машины, что в go, что в erlang.

(no subject)

Date: 2014-04-19 10:20 (UTC)
From: [identity profile] -oxpa-.livejournal.com
хотя я что-то не уверен насчёт "виртуальной машины" в go... Вообще не щупал его.

(no subject)

Date: 2014-04-19 10:25 (UTC)
From: [identity profile] dil.livejournal.com
Индейская национальная изба:

# echo 4194403 > /proc/sys/kernel/pid_max
bash: echo: write error: Invalid argument

# sysctl kernel.pid_max=4194403
sysctl: setting key "kernel.pid_max": Invalid argument
kernel.pid_max = 4194403

(no subject)

Date: 2014-04-19 11:21 (UTC)
From: [identity profile] -oxpa-.livejournal.com
в общем, где-то я читал, что в линуксах ограничение в 30к процессов выбрано ради совместимости со старым софтом. Если подобного старого софта нет, то pid_t это просто целое число, 22 бита которого (для i686) может использоваться под собственно pid. Так что миллион процессов запустить можно, они даже должны шевелиться более-менее .

root@oxpa-desktop:~# grep pid_t /usr/src/linux-source-3.2.0/linux-source-3.2.0/include/asm-generic/posix_types.h
#ifndef __kernel_pid_t
typedef int __kernel_pid_t;
root@oxpa-desktop:~# grep pid_t /usr/src/linux-source-3.2.0/linux-source-3.2.0/include/linux/types.h
typedef __kernel_pid_t pid_t;

Там другой забавный нюанс:
root@oxpa-desktop:~# cat /sys/kernel/slab/mm_struct/object_size
896
root@oxpa-desktop:~# cat /sys/kernel/slab/task_struct/object_size
5888
И ещё, я не помню где это посмотреть, 4к памяти уходит на стек ядра под каждый процесс. Если я не натупил с размерами, это почти 10 гигов памяти на 1кк процессов (на моём десктопе). Лично у меня несколько меньше даже с учётом свопа %)

Блин, к чему это я?

(no subject)

Date: 2014-04-19 11:22 (UTC)
From: [identity profile] avnik.livejournal.com
ну точнее сказать в рантайме go наверное.

(no subject)

Date: 2014-04-19 11:29 (UTC)
From: [identity profile] fi_mihej.livejournal.com
А я как-то пробовал запустить несколько миллионов эрлангских процессов на своей машине (intel i5 3.4GHz; 16Gb ОЗУ; Win 7), так система просто зависла полностью - я такого еще не видел на 7-ке, что б обычная программа (без повышенных привилегий), смогла полностью подвесить всю ОСь (вплоть до реакции на мышь), не создавая кучу реальных потоков :)
Edited Date: 2014-04-19 11:29 (UTC)

(no subject)

Date: 2014-04-19 13:49 (UTC)
From: [identity profile] ufm.livejournal.com
И там и там своя реализация процессов.

(no subject)

Date: 2014-04-19 13:51 (UTC)
From: [identity profile] ufm.livejournal.com
Не, тут без всяких спецэффектов. Спокойно так отработало с миллионом процессов.