Я запускаю Java-программу на 12-ядерном компьютере с 24-мя потоками. У них есть несколько процессов, которые работают одновременно. Кажется, я выполнил слишком много процессов, поэтому целые задачи сделали машину очень медленной.

Вот верхняя информация

Tasks: 556 total,   2 running, 554 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.4%sy,  0.0%ni, 63.2%id, 36.3%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  16295248k total, 16169560k used,   125688k free,     3300k buffers
Swap: 18530296k total, 10867972k used,  7662324k free,    46188k cached

Кажется, что мои процессы ориентированы на потребление памяти, поэтому они использовали почти всю память. В верхней информации я не понимаю, почему вместо 23 выполняется только 2 задачи (я отправил 23 процесса).

free -g
             total       used       free     shared    buffers     cached
Mem:            15         15          0          0          0          0
-/+ buffers/cache:         15          0
Swap:           17         10          7

Кажется, что вся память была использована, и она менялась, что замедляло работу машины.

ps -e -o pid,%cpu,%mem,vsz,rss,comm= --sort=vsz
29707  5.6  4.2 6268732 685660 java
29712  5.2  3.9 6268732 647352 java
...
30269  3.2  4.3 6268732 704676 java
30334  4.8  4.2 6268732 689544 java

Есть 23 таких Java-процессов. Суммируя все% процессора, он очень близок к 100%. Но верхняя информация указывает на то, что процессор не занят.

Cpu(s):  0.1%us,  0.4%sy,  0.0%ni, 63.2%id, 36.3%wa,  0.0%hi,  0.0%si,  0.0%st

Я гуглил, какого размера vsz и rss, но не узнал. Я предполагаю, что блок в килобайтах. Смотря vsz, тогда процессы java используют 6268732kb * 23 = 144,180,836 = ~ 144 ГБ, что, кажется, невозможно поместить в ОЗУ, потому что оно намного больше, чем моя ОЗУ (16 ГБ), поэтому было помещено только 700000 КБ * 23 = ~ 16 ГБ. в память (с информацией rss, которая является частью хранилища данных в ОЗУ). Из-за частой перестановки и переключения контекста система замедлялась.

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

Добавить более подробно:

vmstat -a -S M
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 2 29  16792    124   2105  13152    0    0    29    23    2    0  1  0 95  4  0

Я не знаю, как я должен интерпретировать данные vmstat. Это немного странно, потому что swpd: объем используемой виртуальной памяти выглядит высоким, а si и так равны 0.

2 ответа2

0

В вашей системе явно не хватает оперативной памяти.

  • добавить больше оперативной памяти (надеясь, что вам не нужно добавлять до 128 ГБ)
  • ограничьте количество экземпляров JVM, поскольку каждый из них использует 6 ГБ виртуальной памяти.
  • Настройте их на использование меньшего количества памяти, это 64-битные JVM, посмотрите флаг -Xmx.

Нет проблем с процессором.

0

Ваш вывод действительно правильный. Размеры памяти указаны в килобайтах, как vsz, так и rss, как вы можете проверить, посмотрев страницу man для ps в разделе СТАНДАРТНЫЕ ФОРМАТЫ.

Существует также еще одна проверка, которую вы можете выполнить: rss (размер резидентного набора, т. Е. Память без подкачки, используемая каждым процессом) составляет около 700 МБ на процесс. Если у вас есть 23 таких процесса, это составляет 15 ГБ используемой памяти (не подкачки).

Кроме того, общий объем вашей физической памяти + подкачки намного меньше, чем требуется для одновременного выполнения этих 23 задач, 16 ГБ против 144 ГБ. Таким образом, кажется, что ни одному процессу не выделен необходимый объем памяти в это время.

Так какие у тебя варианты? Просто запустите два процесса за раз, так как их размер таков, что вы можете полностью сохранить их в своей памяти, не меняя местами. Когда они будут готовы, загрузите еще два. Это можно легко сделать с помощью скрипта bash с помощью команды wait:

   my_job < file1.txt &
   my_job < file2.txt &
   wait 1 2
   my_job < file3.txt
   my_job < file4.txt
   wait 3 4....

Это также оставит вам некоторое место в памяти для хранения там /tmp, /run и т.д., Что означает, что способность вашей системы работать в интерактивном режиме будет мало затронута.

Второй вариант (возможно, первый)- спросить себя, как у вас получился 7-гигабайтный Java-код ... но это вопрос к StackOverflow

Редактировать:

Я отвечаю здесь на комментарий Маркуса Торнтона:

Если я могу исправить проблему с памятью, ... хорошо ли отправлять все задачи одновременно?

И да и нет. Если вы исправите проблему с памятью, то, безусловно, сможете выполнить более двух заданий одновременно. Но вы можете выполнить 23? Я думаю, вы переоцениваете полезность многопоточности. Многопоточность - это один процессор с двумя контекстами выполнения, который позволяет параллельно использовать разные функциональные блоки на одном процессоре. Но если задачи похожи, как это должно быть в вашем случае, они, скорее всего, будут использовать одни и те же функциональные блоки, поэтому они будут поставлены в очередь так же, как если бы не было многопоточности. Многопоточность - это не то же самое, что независимость от процессоров, и, в лучшем случае, она обеспечивает минимальное увеличение скорости.

Кстати, как у вас может быть процессор? Вы сказали, что процессоры, а не процессор. Следующая команда

  /bin/cat /proc/cpuinfo | /bin/egrep 'processor|model name|cache size|core|sibling|physical'

поможет вам.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .