2016-08-14 6 views
2

На сервере linux с 6 процессами java, выполняющими tc-сервер с различными веб-приложениями, иногда несколько серверов перестают работать (почти на в то же время) из-за этой ошибки:java.lang.OutOfMemoryError: не удалось создать новое сообщение с собственным потоком, но не так много потоков, запущенных

Exception in thread "ajp-bio-9096-Acceptor-0" java.lang.OutOfMemoryError: unable to create new native thread 
at java.lang.Thread.start0(Native Method) 
at java.lang.Thread.start(Thread.java:714) 
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949) 
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1371) 
at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:162) 
at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:142) 
at org.apache.catalina.core.StandardThreadExecutor.execute(StandardThreadExecutor.java:169) 
at org.apache.tomcat.util.net.JIoEndpoint.processSocket(JIoEndpoint.java:531) 
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:234) 
at java.lang.Thread.run(Thread.java:745) 

Это приводит к тому, один или несколько JVM о том, что работают на 1 машину, чтобы перестать работать. (у нас есть 6 tc-серверов, работающих на одном компьютере) Похоже, что достигнуто максимальное количество процессов на нашей машине Linux. Максимальные потоки на OS-level is about 31389 (ulimit -u). Но мы не видим чрезмерное количество потоков в Linux Когда я смотрю на операционной системе имеется около 1500 потоков, выполняющихся

(ps -eLF | wc -l) 

При профилировании/мониторинг tcserver обрабатывает количество потоков в процессе Java обычно между 50 и 150 и под нагрузкой, которая может идти до 350 из-за http-потоков, но это снизится и никогда не достигнет максимального количества потоков в процессе 1000 (на этой машине).

Мы используем среду выполнения 64 bit Java 1.7, и в ОС всегда есть свободная память.

Сегодня мы получили это сообщение через 1 минуту после запуска сервера. Jvm перестала работать, но процесс os продолжал работать. При взгляде на количество нитей этого процесса было 51.

(ps uH p <pid> | wc -l). 

Так это выглядит как максимальное количество потоков будет достигнуто, но мы никогда не видим много запущенных потоков.

+1

Mind захватывает захват 'top', чтобы мы могли видеть, сколько памяти используется? –

+0

То, что показывает: Задачи: 364 всего, 1 бег, 363 спальных мест, 0 остановок, 0 зомби Cпалты: 9.7% us, 5.9% sy, 0.0% ni, 83.4% id, 0.2% wa, 0.0% привет, 0.8% si, 0.0% st Мем: 8057304k всего, 7778672k, 278632k бесплатно, 476752k буферов Обмен: 1048572k всего, 0k использовано, 1048572k бесплатно, 1301448k кэшировано – Edwin

+0

При взгляде на график использования памяти во времени мы всегда видим небольшая часть свободной памяти как в реальной памяти, так и в свопе. – Edwin

ответ

4

Я нашел причину проблемы.

Я проверил ulimit -u с моим собственным пользователем. Это retuns 31389. И я не мог понять, почему этот предел был достигнут.

Но на производстве эти процессы протекают под другим пользователем, и для этого пользователя -u возвращает все ограничения 1024

Эти 6 серверы в состоянии по умолчанию 50-150 нитей на сервере, поэтому, когда есть временный немного больше нагрузки количество потоков в tcserver достигнет предела 1024.

Итак, в linux мы увеличили количество потоков для рабочего пользователя, и теперь он отлично работает.

 Смежные вопросы

  • Нет связанных вопросов^_^