Еще один вопрос о памяти на Solaris 10.
А топ показывает , что у меня 672 МБ свободной памяти:
130 processes: 126 sleeping, 2 zombie, 2 on cpu
CPU states: 95.1% idle, 3.9% user, 1.0% kernel, 0.0% iowait, 0.0% swap
Memory: 16G phys mem, 672M free mem, 2048M total swap, 2023M free swap
А vmstat показывает мне то же самое:
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr rm s0 s1 s2 in sy cs us sy id
0 0 0 564744 687896 3 13 0 0 0 0 0 0 0 0 0 354 667 752 1 1 98
Но когда я делаю prstat -a -s размер, я получаю это:
NPROC USERNAME SWAP RSS MEMORY TIME CPU
45 orbixadm 1449M 1592M 9.7% 4:46:53 0.4%
48 root 146M 160M 1.0% 8:09:49 1.2%
3 user1 46M 204M 1.2% 0:00:45 0.0%
9 webservd 46M 14M 0.1% 0:00:00 0.0%
5 ctxsrvr 28M 32M 0.2% 4:54:51 0.0%
11 user2 23M 34M 0.2% 0:00:37 0.2%
4 user3 4840K 11M 0.1% 0:00:01 0.0%
1 smmsp 1456K 4552K 0.0% 0:00:24 0.0%
2 daemon 2128K 6224K 0.0% 0:06:32 0.0%
1 user4 1232K 3608K 0.0% 0:00:00 0.0%
1 nagios 376K 2472K 0.0% 0:15:18 0.0%
и, как вы можете видеть, сумма значений RSS не достигает 15 ГБ памяти, и даже если я добавлю к ней значения SWAP.
Итак, мой вопрос: какой команде я верю?
Если top и vmstat дают хороший результат, где моя 15GB используемая память? Если нет, то почему они показывают мне это?
Изменить: результат для команды: % echo ::memstat | mdb -k
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 1687138 13180 82%
Anon 137110 1071 7%
Exec and libs 47107 368 2%
Page cache 95277 744 5%
Free (cachelist) 22248 173 1%
Free (freelist) 69592 543 3%
Total 2058472 16081
Physical 2055442 16058
Изменить 2:
Хорошо, теперь я вижу память, используемую кешем ARC.
Но с некоторыми новыми тестами, теперь у меня есть:
2066 MB used
( prstat -Z и echo :: memstat | mdb -k результат)
1193 MB free
( лучший результат)
8859 MB ARC cache
( kstat zfs :: arcstats: размер результата)
Которые дают нам больше или меньше 12 GB
памяти, в то время как моя система имеет 16 GB
.
Может быть, я что-то пропустил, но где другие 4 GB
?
источник
kstat zfs::arcstats:size
вывод на ваш вопрос.Ответы:
ZFS, вероятно, использует большую часть вашей памяти в качестве кэша ARC. Если вы хотите узнать, как используется ваша RAM, запустите эту команду как root:
На Solaris 10 10/09 и новее это выглядит примерно так:
Как видите, есть строка, указывающая, сколько ОЗУ используется для кэширования данных файла ZFS. К сожалению, вы используете более старую версию Solaris 10, поэтому memstat не показывает эту статистику ZFS отдельно. Он включен в используемую ядром память, что сбивает с толку. Ядро не должно использовать 13 ГБ оперативной памяти при нормальных обстоятельствах.
В любом случае, на вашем сервере все еще есть возможность отобразить полный размер ARC.
Просто запустите эту команду:
Это показывает, что на моей машине в настоящее время используется 273 МБ ОЗУ для обработки кэша ZFS ARC. memstat показывает, что из этих 273 МБ 208 МБ используются в качестве файлового кэша. До 208 МБ ОЗУ может быть выделено автоматически по требованию, если оно потребуется приложениям.
Теперь давайте посмотрим на использование памяти процессами. Если вы используете опцию -Z с prstat, она показывает сводку по зонам под статистикой по процессам. Здесь глобальная (и единственная) зона использует 185 МБ ОЗУ. Это должно (примерно) соответствовать сумме всех процессов rss столбца.
Эти 185 МБ соответствуют сумме двух строк в выводе memstat: «Anon» - это оперативная память, используемая приложениями для хранения данных, и «Exec and libs» - это код приложений и их библиотек.
источник
Память заполнена несопоставленными страницами данных, считанных с диска. Он хранится в памяти, потому что эти файлы могут быть прочитаны снова, а хранение данных в памяти сохраняет чтение диска. Свободная память тратится впустую, поэтому компьютер старается сохранить ее как можно меньше.
Например, скажем, вы запускаете программу. Программа завершается. Программа все еще находится в памяти, но эти страницы памяти не используются никаким процессом, так как программа не запущена. Если система не находится под давлением памяти, страницы хранятся в памяти. Если программа запустится снова, это избавит вас от необходимости освободить ее, просто выделив больше памяти для программы, а затем прочитав ее снова. И если страницы нужны для чего-то другого, это все равно выигрыш для системы, потому что легче перенести страницу памяти напрямую из использования в другую, чем сделать ее свободной только для повторного использования.
Память не является ресурсом, который можно сохранить. Если вы оставите 1 ГБ на час свободным, все, что вы могли бы сделать с этими данными, будет потеряно навсегда.
источник