[Engine-devel] Shared Memory

Amador Pahim apahim at redhat.com
Thu May 31 12:40:26 UTC 2012


On 05/31/2012 06:15 AM, Dan Kenigsberg wrote:
> On Wed, May 30, 2012 at 04:39:42PM -0300, Amador Pahim wrote:
>> Hello,
>>
>> Not sure if it was already discussed, but I'd like to talk about
>> oVirt "Shared Memory".
>>
>> Webadmin has the Shared Memory percent information in host general
>> tab [1]. Initially, I thought that Shared Memory was the KSM
>> de-duplication results. But comparing with my KSM stats, it does not
>> make sense. My env:
>>
>>      3,5 GB virt-host.
>>      6 identical VMs running with 1GB RAM each.
>>
>>      Webadmin host details:
>>          Memory Sharing: Active
>>          Shared Memory: 0%
>>
>>      KSM - How many shared pages are being used:
>>
>>          $ cat /sys/kernel/mm/ksm/pages_sharing
>>          109056
>>
>>      KSM - How many more sites are sharing them i.e. how much saved
>>
>>          $ cat /sys/kernel/mm/ksm/pages_sharing
>>          560128
>>
>>      Converting to Mbytes:
>>
>>          $ echo $(( (109056 * $(getconf PAGE_SIZE)) / (1024 * 1024) ))
>>          426
>>
>>          $ echo $(( ( 560128 * $(getconf PAGE_SIZE)) / (1024 * 1024) ))
>>          2188
>>
>> With those KSM results, I could expect something but 0 in "Shared Memory".
>>
>> Tracing the origin of "Shared Memory" in oVirt code, I realized it's
>> coming from memShared value (from getVdsStats vdsm command),  which
>> is provided in Mbytes:
>>
>>      $ vdsClient -s 192.168.10.250 getVdsStats | grep memShared
>>              memShared = 9
>>
>> Finding memShared function in vdsm, we have:
>>
>> $VDSM_ROOT/vdsm/API.py
>>
>> ...
>>
>> stats['memShared'] = self._memShared() / Mbytes
>>
>> ...
>>
>> def _memShared(self):
>>      """
>>      Return an approximation of memory shared by VMs thanks to KSM.
>>      """
>>      shared = 0
>>      for v in self._cif.vmContainer.values():
>>          if v.conf['pid'] == '0':
>>              continue
>>          try:
>>              statmfile = file('/proc/' + v.conf['pid'] + '/statm')
>>              shared += int(statmfile.read().split()[2]) * PAGE_SIZE_BYTES
>>          except:
>>              pass
>>      return shared
>>
>> ...
>>
>> memShared is calculated adding the shared pages value (3rd field)
>> from /proc/<VM_PID>/statm file from all running VMs, converting to
>> bytes through PAGE_SIZE value and transforming to Mbytes at the end.
>> This field in statm file currently is (it changed along kernel
>> history) the count of pages instantiated in the process address
>> space which are shared with a file, including executable, library or
>> shared memory. Despite vdsm code comment, KSM shared pages are not
>> accounted here. KSM works de-duplicating and sharing memory pages
>> without process awareness.
>>
>> Engine is calculating the percent considering total physical memory
>> - memSize value from getVdsCapabilities vdsm command:
>>
>>      $ vdsClient -s 192.168.10.250 getVdsCapabilities | grep memSize
>>          memSize = 3574
>>
>> Calculating the percent:
>>
>>      $ echo "scale=2; 9 * 100 / 3574" | bc
>>      .25
>>
>> So, we have arround 0,25%, rounded to 0%. "Shared Memory" is
>> coherent, but not reflecting the real page deduplication benefits.
>> And unnoticed administrators - me included - are led to think that
>> Shared Memory is related with KSM results.
>>
>> IMO, memShared is not providing any representative information. On
>> the other hand, the missing KSM results are really important to
>> oVirt administrators, providing information about how much memory
>> they are over committed by, for capacity management, and how much
>> money oVirt is saving in memory.
>>
>> In order to offer those KSM stats to engine, I sent a patch [2]
>> (waiting approval) adding "ksmShared" and "ksmSharing" values to
>> vdsm getVdsStats command in a standard way, with key names that fits
>> with existing KSM ones (ksmCpu, ksmPages and ksmState).
>>
>> Before patch:
>>      $ vdsClient -s 192.168.10.250 getVdsStats | grep ksm
>>          ksmCpu = 1          ->  the ksmd process cpu load
>>          ksmPages = 664      ->  pages to scan before ksmd goes to sleep
>>          ksmState = True     ->  is ksm running?
>>
>> With the patch:
>>      $ vdsClient -s 192.168.10.250 getVdsStats | grep ksm
>>          ksmCpu = 1
>>          ksmPages = 664
>>          ksmShared = 426     ->  how many Mbytes of memory are being shared
>>          ksmSharing = 2188   ->  how many more sites are sharing them
>> i.e. how much Mbytes are being saved
>>          ksmState = True
>>
>>
>> Finally my questions:
>>
>> 1 - Is sharedMem value (from /proc/PID/statm) that significant to be
>> kept in host details? If yes, why?
> I belive memShared used to report the Right Thing (i.e., an estimate of
> memory saved by KSM) in the rhev-2.Y days. Oded, could you confirm?
> Has it changed when we moved to EL6, and nobody noticed?
>
>> 2 - What about - and how (%, Mb, ...) - to add the vdsm new
>> ksmShared and ksmSharing stats in host details?
> I'm not sure if ksmShared/ksmSharing have an "added value" to the the
> admin, but if it does, I see no problem in reporting it from vdsm.
> But then again, a meaningful memShared seems enough to me.
>
>> Sorry about my long history. I look forward to hearing your comments.
> Actually the long history is useful to understand the issue, thanks for
> it.


Two more points here:

- "The KSM module shipped in this release is a different version from 
the KSM module found on the latest upstream kernel versions. Newer 
features, such as exporting statistics on the /sys filesystem, that are 
implemented upstream are not in the version shipped in this release." [3]

This should explain why /proc/<pid>/statm was used to get KSM stats.

- "[PATCH] statm: shared = rss - anon_rss" [4]

This should explain what's changed in statm.


So, I agree with you in just change memShared source.

--
Pahim

[3] - 
http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html/5.4_Technical_Notes/Known_Issues-kvm.html
[4] - http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.10





-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ovirt.org/pipermail/engine-devel/attachments/20120531/bc022c82/attachment.html>


More information about the Engine-devel mailing list