пятница, 11 июня 2010 г.

Не забываем о ресурсах

Готовый тестовый пример на Scala, c тредами. Создается 2000 тредов, которые делают что-то необременительное. Запускаю -- "java.lang.OutOfMemoryError: unable to create new native thread". Чудненько. Пляски вокруг параметров виртуальной машины не помогают, или наборот -- загоняют jvm в "корку".
Читаю документацию, ссылки, маны, пробую, комбинирую... температура (у меня и у проца) выросла еще на четыре градусов. Замечаю нюанс: ulimit во freebsd не показывает ограничения на кол-во тредов. В мане (bash) ключ "-T" есть, а в самой утилите -- нет. В линуксе, кстати, man правильнее, ключ там не указан.
И тут наступает прозрение.
sysctl kern.threads.max_threads_per_proc: 1500
Уменьшаю кол-во тредов до тысячи, работает. Поднимаю до полторы тысячи, перестает.

Меняю на max_threads_per_proc до 2000, и сразу все как по маслу.

Никогда програмисты сами не научатся создавать сообщения об ошибках, точно отражающие ситуацию, если их жестоко не пинать. По себе знаю. :(

Комментариев нет: