У меня есть сервер Linux (Ubuntu 10.04), у которого нет места подкачки (swapon -l ничего не сообщает, подкачка памяти 0kb указана в /proc /meminfo). Начало вывода top (отсортировано по% mem) воспроизводится ниже:

top - 04:18:28 up  7:31,  2 users,  load average: 0.93, 0.76, 0.71
Tasks:  25 total,   2 running,  23 sleeping,   0 stopped,   0 zombie
Cpu(s): 15.0%us,  0.8%sy,  0.0%ni, 84.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4195200k total,  4177028k used,    18172k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
30075 admin     20   0 4026m 1.4g 9648 S   31 35.7 271:03.97 2.5g java
 7700 root      15   0  170m 9152 4360 S    0  0.2   0:00.96 161m apache2
 7730 www-data  15   0  171m 6268 1168 S    0  0.1   0:00.00 165m apache2
 7726 www-data  15   0  171m 6232 1108 S    0  0.1   0:00.01 165m apache2
 9520 www-data  15   0  171m 6228 1100 S    0  0.1   0:00.00 165m apache2

Моя путаница заключается в том, как можно использовать 4 ГБ памяти, используя только около 40% зарегистрированного использования (ps согласен с этими цифрами). Кроме того, я запутался, как можно выделить больше виртуальной памяти, чем резидентной, когда нет места подкачки.

Как сообщалось, нет свободной памяти, apt-get не удалось из-за неправильного распределения. Это также смущает меня, так как я думал, что убийца ООМ вступил бы в действие прежде, чем это могло произойти.

1 ответ1

2

Число в столбце VIRT не означает, что вся эта память фактически не используется, оно просто помечено как выделенное. Java-программы обычно выделяют много виртуального пространства.

Иногда это может быть немного грязно; по умолчанию ядро Linux позволяет программам перегружать память - то есть выделять больше памяти, чем доступно в системе. Это почти то же самое, что провайдеры электронной почты дают вам гигабайты и гигабайты свободного места для электронной почты, потому что они знают / надеются, что не все на самом деле используют столько места, а лишь его часть.

Сколько допускается чрезмерная фиксация? В типичных дистрибутивах настройками по умолчанию является использование vm.overcommit_memory=0 , что означает, что ядро Linux использует некоторую эвристику для определения этой суммы. Проверьте значение, которое вы сейчас установили с помощью sysctl vm.overcommit_memory

Если это 0 и вы хотите изменить поведение ядра на «Не допускать чрезмерной фиксации», добавьте эти строки в /etc/sysctl.conf:

vm.overcommit_memory=2
vm.overcommit_ratio=0

После того, как вы дадите команду sudo sysctl -p , будут загружены новые настройки.

Но что означают эти строки?

vm.overcommit_memory=2 изменяет модель избыточной фиксации с эвристики на определяемое пользователем значение.

vm.overcommit_ratio=0 - это процент памяти, который разрешен для чрезмерной фиксации . Ноль означает, что не допускается чрезмерная фиксация.

Но если вы хотите вместо этого разрешить около 2 гигабайт чрезмерной передачи в вашем случае, то

vm.overcommit_memory=2
vm.overcommit_ratio=50

сделал бы это.

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