Назад | Перейти на главную страницу

Почему мой KVM, сервер RHEL6.2 меняет местами?

У меня есть сервер 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.