Bugzilla will be upgraded to version 5.0. The upgrade date is tentatively scheduled for 2 December 2018, pending final testing and feedback.
Bug 902688 - incorrect committed_memory if set_process_name=1
incorrect committed_memory if set_process_name=1
Status: CLOSED ERRATA
Product: Red Hat Enterprise Linux 6
Classification: Red Hat
Component: qemu-kvm (Show other bugs)
6.3
Unspecified Linux
low Severity low
: rc
: 6.5
Assigned To: Laszlo Ersek
Virtualization Bugs
:
: 963256 (view as bug list)
Depends On:
Blocks: 976336
  Show dependency treegraph
 
Reported: 2013-01-22 04:35 EST by markus hetzenecker
Modified: 2013-11-21 01:30 EST (History)
13 users (show)

See Also:
Fixed In Version: qemu-kvm-0.12.1.2-2.363.el6
Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of:
: 976336 (view as bug list)
Environment:
Last Closed: 2013-11-21 01:30:18 EST
Type: Bug
Regression: ---
Mount Type: ---
Documentation: ---
CRM:
Verified Versions:
Category: ---
oVirt Team: ---
RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: ---


Attachments (Terms of Use)
ksmtuned: more flexible process name search pattern (1.15 KB, patch)
2013-04-18 09:36 EDT, Laszlo Ersek
no flags Details | Diff


External Trackers
Tracker ID Priority Status Summary Last Updated
Red Hat Product Errata RHSA-2013:1553 normal SHIPPED_LIVE Important: qemu-kvm security, bug fix, and enhancement update 2013-11-20 16:40:29 EST

  None (edit)
Description markus hetzenecker 2013-01-22 04:35:20 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"
Comment 2 Ademar Reis 2013-01-22 09:03:48 EST
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
Comment 5 Laszlo Ersek 2013-04-04 06:19:47 EDT
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.)
Comment 6 Laszlo Ersek 2013-04-18 08:22:34 EDT
(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).
Comment 7 Laszlo Ersek 2013-04-18 09:36:15 EDT
Created attachment 737309 [details]
ksmtuned: more flexible process name search pattern
Comment 10 Ademar Reis 2013-05-20 14:58:36 EDT
*** Bug 963256 has been marked as a duplicate of this bug. ***
Comment 16 Shaolong Hu 2013-07-04 07:31:42 EDT
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
Comment 17 Shaolong Hu 2013-07-04 23:07:47 EDT
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.
Comment 18 errata-xmlrpc 2013-11-21 01:30:18 EST
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

Note You need to log in before you can comment on or make changes to this bug.