Назад | Перейти на главную страницу

Linux: какой процесс занимал всю память?

У нас есть 4 ГБ на нашем сервере linux, но в настоящее время мы можем использовать только ~ 1,8 ГБ для нашего java-сервера, который является первым java-процессом, перечисленным ниже. (200 МБ бесплатно, поэтому мы можем максимально использовать 1,6 ГБ + 0,2 ГБ)

Машина выходит из строя, когда мы используем больше. Поэтому мы указали -Xmx1600m и -XX: MaxPermSize = 200m, чтобы ограничить ОЗУ сервера до 1,8 ГБ. Но нам нужно больше оперативной памяти! Куда пропала оставшаяся оперативная память?

Вот вывод программы top, отсортированный по использованию памяти (через большую букву M):

Mem:   4083952k total,  3857856k used,   226096k free,   169320k buffers
Swap:  2104504k total,      176k used,  2104328k free,  1939080k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                           
28155 root      16   0 1835m 1.6g 7848 S    2 40.5  47:36.26 java                                                                                              
19609 root      16   0 45996 7052 3148 S    0  0.2  14:35.97 httpd2-prefork                                                                                    
 6802 root      16   0 46132 5916 1932 S    0  0.1   0:00.09 httpd2-prefork                                                                                    
 6866 root      15   0 46132 5916 1932 S    0  0.1   0:00.07 httpd2-prefork    

Как видите, существует множество (и даже больше) процессов httpd2-prefork. Но даже если я накоплю байты (25 * ~ 46 КБ = ~ 1 МБ), они никогда не станут такими большими.

free -m печатает:

             total       used       free     shared    buffers     cached
Mem:          3988       3768        219          0        165       1894
-/+ buffers/cache:       1708       2279
Swap:         2055          0       2055

Где моя ошибка? Могу ли я настроить сервер, чтобы предоставить процессу Java больше оперативной памяти?

Кстати: мы не используем виртуальную машину вроде Вот

Обновить

Как было указано в комментариях: это только 32-битное ядро ​​:-( (через uname -a). Значит, я могу использовать как минимум 3 ГБ? Но сам сервер кажется 64-битным? Из-за lm (long режим) на выходе?

grep flags /proc/cpuinfo
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe lm constant_tsc pni monitor ds_cpl cid cx16 xtpr
...

Вот это еще один очень похожий вопрос.

Ах, я вижу, вы ошиблись, как рассчитать свободную оперативную память в Linux.

Linux имеет тенденцию интенсивно использовать всю оперативную память для кеширования. Вместо того, чтобы каждый раз читать список каталогов с диска, он кэширует записи каталога в ОЗУ. Он кэширует часто используемые файлы, поэтому их не нужно каждый раз загружать с диска. Если какому-то процессу действительно нужна оперативная память для использования, кеш будет немедленно удален.

Таким образом, формула для расчета фактически используемого ОЗУ: всего - (бесплатно + буферы + кешированные), в твоем случае 3988 - (219 + 165 + 1894) или другими словами 3988–2278. То есть 1710 г. используемые мегабайты оперативной памяти и 2278 мегабайты оперативной памяти для вас.

Не верите мне? Видите ли, на вашем сервере даже нет свопа. :)

Но, конечно, сбой машины - если вы имеете в виду жесткую блокировку - это странная вещь. Этого действительно не должно происходить. Я подозреваю, что это неисправная RAM-карта, доступ к которой возможен только в случае использования> 2 GB RAM.

Я вижу только старые параметры процессора, поэтому подозреваю, что у вас только 32-разрядный процессор, но вы должны иметь возможность использовать все 4 ГБ, хотя вам может потребоваться изучить, как заставить это работать так, как вы хотите (может потребоваться включить PAE, например).

И вы имеете в виду сбой приложения java или всей машины? Машина не должна вылетать (хотя может некоторое время перестать отвечать).

Замечание - в математике ошибка.

(25* ~46KB = ~1MB) следует читать как (25* ~46000KB = ~1150MB).

Однако размер ресурса более важен, поскольку он дает более реалистичное чтение памяти для каждого процесса.

(25*~5000KB = ~125MB)