Red Hat Bugzilla – Bug 902688
incorrect committed_memory if set_process_name=1
Last modified: 2013-11-21 01:30:18 EST
Description of problem: To have useful names in the process list I configured in /etc/libvirt/qemu.conf: set_process_name = 1 now the process names are like # ps -p 3473 -o pid,user -o comm PID USER COMMAND 3473 qemu qemu:svn but now the the function committed_memory in /usr/sbin/ksmtuned do not calculate the committed memory: ps -C "qemu-kvm" -o rsz= is emtpy, but does not result in an error because of the sum in $[committed + thres] Version-Release number of selected component (if applicable): 0.12.1.2 2.295.el6_3.2.x86_64.rpm How reproducible: alwyas if /etc/libvirt/qemu.conf : set_process_name = 1 Steps to Reproduce: 1. /etc/libvirt/qemu.conf : set_process_name = 1 /etc/ksmtuned.conf : LOGFILE=/var/log/ksmtuned DEBUG=1 2. create vms with qemu 3. watch /sys/kernel/mm/ksm/pages_* and /var/log/ksmtuned Actual results: no run (check for sharing pages) of ksmd Expected results: if the free memory is less then some threshold, ksmd starts to check for sharing pages. Additional info: Changed the script to use the usename (qemu) for calculation. This works, but has maybe also some drawbacks. --- ksmtuned.orig 2012-09-03 13:44:56.000000000 +0200 +++ /usr/sbin/ksmtuned 2013-01-22 09:46:29.999246237 +0100 @@ -69,9 +69,9 @@ committed_memory () { # calculate how much memory is committed to running qemu processes - local progname - progname=${1:-qemu-kvm} - ps -C "$progname" -o rsz= | awk '{ sum += $1 }; END { print sum }' + local username + username=${1:-qemu} + ps --User $username -o rsz= | awk '{ sum += $1 }; END { print sum }' } there is also a minor bug @@ -99,7 +99,7 @@ debug committed $committed free $free if [ $[committed + thres] -lt $total -a $free -gt $thres ]; then KSMCTL stop - debug "$[committed + thres] < $total and free > $thres, stop ksm" + debug "$[committed + thres] < $total and $free > $thres, stop ksm" return 1 fi debug "$[committed + thres] > $total, start ksm"
Markus, thanks for taking the time to enter a bug report with us. We appreciate the feedback and look to use reports such as this to guide our efforts at improving our products. That being said, we're not able to guarantee the timeliness or suitability of a resolution for issues entered here because this is not a mechanism for requesting support. If this issue is critical or in any way time sensitive, please raise a ticket through your regular Red Hat support channels to make certain it receives the proper attention and prioritization to assure a timely resolution. For information on how to contact the Red Hat production support team, please visit: https://www.redhat.com/support/process/production/#howto
The "set_process_name" option in /etc/libvirt/qemu.conf sets "driver->setProcessName" and makes RHEL-6 libvirtd (qemuBuildCommandLine(), [src/qemu/qemu_command.c]) take the according branch: if (qemuCapsGet(qemuCaps, QEMU_CAPS_NAME)) { virCommandAddArg(cmd, "-name"); if (driver->setProcessName && qemuCapsGet(qemuCaps, QEMU_CAPS_NAME_PROCESS)) { virCommandAddArgFormat(cmd, "%s,process=qemu:%s", def->name, def->name); } else { virCommandAddArg(cmd, def->name); } } # If enabled, libvirt will have QEMU set its process name to # "qemu:VM_NAME", where VM_NAME is the name of the VM. The QEMU # process will appear as "qemu:VM_NAME" in process listings and # other system monitoring tools. By default, QEMU does not set # its process title, so the complete QEMU command (emulator and # its arguments) appear in process listings. # #set_process_name = 1 In qemu-kvm the "process=qemu:XXXX" part (actually, the XXXX part) is handled by main() [vl.c] set_proc_name() prctl(PR_SET_NAME) The name settable with this prctl is 16 chars long, of which "qemu:" takes up five. (See "include/linux/sched.h" in the kernel: /* Task command name length */ #define TASK_COMM_LEN 16 struct task_struct { /* ... */ char comm[TASK_COMM_LEN]; /* executable name excluding path - access with [gs]et_task_comm (which lock it with task_lock()) - initialized normally by setup_new_exec */ /* ... */ } PR_SET_NAME [kernel/sys.c] invokes set_task_comm().) Since libvirt always sets the "qemu:" prefix in the task name, I propose to keep the name based search in qemu-kvm's "redhat/ksmtuned", function committed_memory(), for stability's sake, as opposed to the uid-based search suggested in comment 0. (Of course Dan or Dan or Eric could know better, which is why I've CC'd them.) For searching we should use "pgrep" (from the same procps package as "ps"): local pidlist pidlist=$(pgrep -d ' ' -- '^qemu(-kvm|:.{1,11})$') ps -p "$pidlist" -o rsz= | awk ... (The XXXX part should be at least 1 char long; I think libvirtd doesn't allow def->name to be empty.)
(In reply to comment #0) > there is also a minor bug > @@ -99,7 +99,7 @@ > debug committed $committed free $free > if [ $[committed + thres] -lt $total -a $free -gt $thres ]; then > KSMCTL stop > - debug "$[committed + thres] < $total and free > $thres, stop ksm" > + debug "$[committed + thres] < $total and $free > $thres, stop ksm" > return 1 > fi > debug "$[committed + thres] > $total, start ksm" I don't think this part is a bug. $free (ie. the decimal value) is logged just before the "if", the "free > $thres" part even seems more informative (it explains the logic, and the value is known from the previous log entry).
Created attachment 737309 [details] ksmtuned: more flexible process name search pattern
*** Bug 963256 has been marked as a duplicate of this bug. ***
Verified on qemu-kvm-0.12.1.2-2.376.el6.x86_64: 1. in /etc/libvirt/qemu.conf: set_process_name = 1 2. start a guest consuming most memory of host: # free -m total used free shared buffers cached Mem: 7697 7526 170 0 8 1272 -/+ buffers/cache: 6245 1451 Swap: 57343 6 57337 3.# ps -C "qemu:vr-rhel6-x86_64-kvm" -o comm COMMAND qemu:vr-rhel6-x 4.#cat /var/log/ksmtuned Thu Jul 4 19:18:14 CST 2013: committed 55816 free 7574688 Thu Jul 4 19:18:14 CST 2013: 1632272 < 7882284 and free > 1576456, stop ksm Thu Jul 4 19:19:14 CST 2013: committed 6123360 free 1484712 Thu Jul 4 19:19:14 CST 2013: 7699816 > 7882284, start ksm Thu Jul 4 19:19:14 CST 2013: 1484712 < 1576456, boost Thu Jul 4 19:19:14 CST 2013: KSMCTL start 600 21
Reproduced with qemu-kvm-0.12.1.2-2.356.el6.x86_64: # free -m total used free shared buffers cached Mem: 7697 5720 1976 0 6 47 -/+ buffers/cache: 5666 2030 Swap: 57343 147 57196 #cat /var/log/ksmtuned Fri Jul 5 11:02:50 CST 2013: committed 1262132 free 2086504 Fri Jul 5 11:02:50 CST 2013: 2838588 < 7882284 and free > 1576456, stop ksm Fri Jul 5 11:03:50 CST 2013: committed 1262228 free 2073532 Fri Jul 5 11:03:50 CST 2013: 2838684 < 7882284 and free > 1576456, stop ksm The guest takes 4.5G memory, bug it only counts 1262228.
Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. http://rhn.redhat.com/errata/RHSA-2013-1553.html