У нас есть 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)