Разница между free -m и ps -euf

Я не специалист по Linux, поэтому заранее извиняюсь за глупый вопрос. У меня есть vps-машина с ubuntu 10.04 и 512Mb ОЗУ. Я пытаюсь угадать, сколько памяти доступно после запуска демона mongodb.

Если я бегу free -m я получаю

  total used free shared buffers cached Mem: 496 489 6 0 4 452 -/+ buffers/cache: 33 462 Swap: 511 4 507 

Если я запустил ps euf я получу

 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 948 0.0 0.0 5928 472 tty6 Ss+ Aug25 0:00 /sbin/getty 384 root 947 0.0 0.0 5928 472 tty5 Ss+ Aug25 0:00 /sbin/getty 384 root 946 0.0 0.0 5928 472 tty4 Ss+ Aug25 0:00 /sbin/getty 384 root 945 0.0 0.0 5928 472 tty3 Ss+ Aug25 0:00 /sbin/getty 384 root 944 0.0 0.0 5928 472 tty2 Ss+ Aug25 0:00 /sbin/getty 384 root 943 0.0 0.1 51856 536 hvc0 Ss Aug25 0:00 /bin/login -- root 978 0.0 0.4 20580 2424 hvc0 S Aug25 0:01 \_ -bash TERM= root 7593 0.0 0.1 10332 524 hvc0 T Aug25 0:00 \_ nano he root 12576 0.7 3.1 122520 16220 hvc0 Sl 07:42 0:12 \_ ./mongo root 12599 0.0 0.2 16300 1060 hvc0 R+ 08:09 0:00 \_ ps euf 

Кажется, что менее 5% памяти используется процессами, но у меня всего 6 МБ свободной памяти … почему?

Буферы и кеш имеют динамический размер. Если процессам требуется больше места, то они берутся из буферов и кеша.

Ключ должен смотреть на вторую строку («- / + buffers / cache»).

 Mem: 496 489 6 0 4 452 -/+ buffers/cache: 33 462 

Обратите внимание, что свободная во второй строке (462) представляет собой сумму 6 (бесплатно), 4 (буферов) и 452 (кэшированных). Это реальное количество свободного места. Если это будет слишком низким, система начнет заменять процессы из памяти на место подкачки.

Таким образом, на самом деле вы используете 33 МБ памяти и имеете доступ к 462 МБ – возможно, немного меньше, так как вам понадобятся некоторые буферы для ввода-вывода.

Помимо правильного объяснения Арсеге , есть и два других заблуждения, скрытые в вашей интерпретации ps euf .

  1. Команда ps euf не перечисляет все процессы – для этого вы должны использовать ps axeuf .

  2. Процент используемой памяти для каждого процесса дается, как вы можете видеть, округлен до 0.1% . Поэтому их добавление даст ошибочные результаты – (примерно) все процессы используют некоторую память – даже если она меньше 0.1% . Если есть, например, 20 процессов, которые используют 0.05% , они бы добавили до 1% , а не 0% .