У меня есть сервер RHEL6.2, который я использую для запуска виртуальных машин KVM.
Сам сервер имеет 16 ГБ оперативной памяти. Я хочу увидеть самую большую виртуальную машину, которую я могу запустить на ней, и не позволять процессу qemu-kvm менять местами. ОЗУ виртуальной машины составляет ~ 15 ГБ. (Да, я понимаю, что это выходит за рамки лимита, но прочтите до конца, прежде чем отвечать чем-то вроде «15 ГБ - это слишком много».)
[root@xxx libvirt]# virsh dumpxml VM2 | grep -i memory
<memory>15000000</memory>
<currentMemory>15000000</currentMemory>
[root@xxx libvirt]# ps -ef | grep kvm
root 872 1 16 10:55 ? 00:03:00 /usr/libexec/qemu-kvm [...] -m 14649 -name VM2 [...]
[root@xxx libvirt]# free -k
total used free shared buffers cached
Mem: 16332640 16194440 138200 0 1544 15700
-/+ buffers/cache: 16177196 155444
Swap: 35651568 7583432 28068136
Но RSS процесса KVM составляет всего 880 МБ (столбец 6 ниже). Я ожидаю, что это будет больше похоже на 12-14 ГБ.
[root@xxx libvirt]# ps -eF | grep kvm
root 872 1 14 4534221 882916 7 10:55 ? 00:03:11 /usr/libexec/qemu-kvm
И, если сложить RSS всех процессов, всего ~ 1гиг.
[root@xxx libvirt]# ps -eF | awk '{print $6}' | grep '[0-9]' | tr '\n' '+' | sed 's/+$/\n/' | bc
1004064
Вот процессы, которые больше всего используют память (RSS, столбец 6).
root 5188 22329 0 27572 1192 4 11:19 pts/0 00:00:00 ps -eF
root 31461 1 0 10746 1236 7 Jul25 ? 00:06:22 [...]
root 6339 6275 0 272676 3288 4 Jul27 ? 00:13:38 [...]
root 2059 1 1 443909 13352 7 Jul17 ? 05:29:11 libvirtd --daemon
root 872 1 13 4534221 928300 2 10:55 ? 00:03:24 /usr/libexec/qemu-kvm [...]
Я ожидаю, что для виртуальной машины все еще будет доступно около 300-500 МБ памяти.
ОБНОВИТЬ
После перезагрузки машины я больше не могу это воспроизвести. Теперь система работает так, как я ожидал. Вот эти ожидаемые цифры.
О, я должен упомянуть. На виртуальной машине работает программа, интенсивно использующая память. Он выделяет 80% общей памяти и постоянно записывает в нее случайные числа.
RSS ВМ:
[root@hb05b15 ~]# ps -eF | grep kvm
root 7330 1 97 4520362 12483728 2 11:59 ? 00:39:55 /usr/libexec/qemu-kvm [...]
Номера памяти и обмена:
[root@hb05b15 ~]# free -k
total used free shared buffers cached
Mem: 16332640 13277468 3055172 0 21064 215196
-/+ buffers/cache: 13041208 3291432
Swap: 35651568 0 35651568
Подведем итог RSS по всем процессам:
[root@hb05b15 ~]# ps -eF | awk '{print $6}' | grep '[0-9]' | tr '\n' '+' | sed 's/+$/\n/' | bc
12607180
У вас не осталось оперативной памяти для операционной системы, кеша файловой системы или чего-либо еще.
Не перегружайте ОЗУ виртуальной машины так высоко, не оставляя достаточного запаса.
Теперь, конечно, вы можете отключить своп и посмотреть, что будет ...
Существует большая разница между использованием подкачки и активной подкачкой машины. Ядро будет упреждающе перемещать все больше и больше на диск, поскольку оно видит запросы на большие объемы памяти. Если данные, перемещенные на диск, используются не так часто, это не обязательно является большой проблемой. Если данные постоянно меняются местами, то обычно возникает большая проблема. Настоящая мера здесь - посмотреть на что-то вроде iostat, чтобы увидеть, сколько данных фактически передается туда и обратно в заданный интервал.
Тем не менее, виртуальная машина 15G на коробке 16G, вероятно, не будет хорошо работать. Сама операционная система требует определенного количества ресурсов, и для виртуальной машины всегда есть определенный процент накладных расходов. Если вы действительно активно меняете местами, вы можете увидеть существенные улучшения, просто отступив, скажем, на 12 или 13G.