Great work!
On Mon, Nov 10, 2014 at 3:50 PM, Francesco Romani <fromani(a)redhat.com> wrote:
Hi everyone,
I'd like to share initial profiles of VDSM comparing
XMLRPC and JSONRPC, plus two patches optimizing the latter.
While the low-level profiler (yappi) is now working nicely,
and this is a good building block, I'm not really satisfied about
the testcase - altough it is a fair approximation of reality;
most important, I'm not satisfied about benchmark driver, which
is too coarse grained.
The benchmark driver is a simple python script using the REST APIs
of Engine.
I'd like to be able to bypass Engine, but vdsClient is not good enough:
no JSONRPC option yet.
Once I have a bit o time will work on it.
I haven't found yet a good way to rule out noise and stress only the getStats
flow. Out of necessity, either recover[1] or start/stop get in the way.
I'm working on that.
Profiles are meant as rough comparison, I cannot yet answer
to question 'how xmlrpc and jsonrpc compare performancewise?'.
To properly answer we need better tools. I'll work on that.
Out of necessity, the testcase is:
- on RHEL 6.5 server host (update to 6.6 ASAP)
- on a freshly started VDSM,
- serially boot 100 VMs, each one 1 core, 16 MiB ram, 1GB disk on ISCSI,
no OS installed -thus no guest agent
- after every VM is booted, let them run for 10 (ten) minutes,
let Engine poll them with default settings (e.g. poll interval)
- serially stop all the VMs
- stop VDSM, collect profile.
- profiling options in vdsm.conf:
profile_enable = true
profile_builtin = true
So, in attachment we have:
xmlrpc.txt: xmlrpc, default settings
jsonrpc.txt: jsonrpc, default settings
jsonrpc_cmod.txt: jsonrpc + simplejson 2.0.9 (patch discussed [2] not yet on gerrit)
jsonrpc_cmod_hack.txt: jsonrpc + simplejson 2.0.9 + replaced deepcopy:
patch isn't ready to be reviewd,
http://gerrit.ovirt.org/#/c/34989/
to be discussed in a separate topic
To ease the discussion, I'm pasting the top 10 most expensive calls for each of the
profiles.
xmlrpc: 45222158 function calls (65166621 primitive calls) in 783.999 CPU seconds
ncalls tottime percall cumtime percall filename:lineno(function)
78/100 304.985 3.910 155.030 1.550
/usr/lib/python2.6/site-packages/mom/GuestMonitor.py:51(GuestMonitor.run)
110/125 136.121 1.237 167.478 1.340
/usr/lib64/python2.6/threading.py:481(Thread.run)
99/100 61.620 0.622 114.241 1.142
/usr/share/vdsm/virt/sampling.py:433(VmStatsThread.run)
88713/1231936 30.654 0.000 189.426 0.000
/usr/lib64/python2.6/copy.py:251(_deepcopy_dict)
54150 20.575 0.000 67.119 0.001
/usr/share/vdsm/virt/vm.py:2912(Vm._getRunningVmStats)
1445/3413514 16.291 0.011 0.052 0.000
/usr/share/vdsm/protocoldetector.py:94(MultiProtocolAcceptor._process_events)
100 8.570 0.086 69.581 0.696
/usr/share/vdsm/virt/sampling.py:452(VmStatsThread.collect)
1168251 7.756 0.000 7.756 0.000
/usr/lib/python2.6/site-packages/vdsm/utils.py:424(convertToStr)
10480836 6.313 0.000 6.313 0.000
/usr/lib64/python2.6/copy.py:197(_deepcopy_atomic)
155426 5.701 0.000 10.339 0.000
/usr/lib64/python2.6/xml/dom/expatbuilder.py:743(ExpatBuilderNS.start_element_handler)
jsonrpc: 60351712 function calls (96981783 primitive calls) in 823.499 CPU seconds
ncalls tottime percall cumtime percall filename:lineno(function)
98/100 197.061 2.011 265.583 2.656
/usr/lib/python2.6/site-packages/mom/GuestMonitor.py:51(GuestMonitor.run)
13331/13412 117.132 0.009 294.482 0.022
/usr/lib64/python2.6/threading.py:481(Thread.run)
97439/12454808 71.739 0.001 193.515 0.000
/usr/lib64/python2.6/copy.py:144(deepcopy)
100 38.230 0.382 103.942 1.039
/usr/share/vdsm/virt/sampling.py:433(VmStatsThread.run)
96751/1103236 30.798 0.000 191.919 0.000
/usr/lib64/python2.6/copy.py:251(_deepcopy_dict)
66286 24.808 0.000 82.338 0.001
/usr/share/vdsm/virt/vm.py:2912(Vm._getRunningVmStats)
4107389/16859232 23.189 0.000 48.677 0.000
/usr/lib64/python2.6/json/encoder.py:284(JSONEncoder._iterencode)
4107412/10861908 17.214 0.000 44.677 0.000
/usr/lib64/python2.6/json/encoder.py:213(JSONEncoder._iterencode_dict)
100 9.888 0.099 77.989 0.780
/usr/share/vdsm/virt/sampling.py:452(VmStatsThread.collect)
1435169/1435182 9.272 0.000 9.313 0.000
/usr/lib/python2.6/site-packages/vdsm/utils.py:424(convertToStr)
jsonrpc + simplejson 2.0.9: 50417851 function calls (64835240 primitive calls) in 651.791
CPU seconds
ncalls tottime percall cumtime percall filename:lineno(function)
98/100 171.140 1.746 240.428 2.404
/usr/lib/python2.6/site-packages/mom/GuestMonitor.py:51(GuestMonitor.run)
97345/12686631 70.419 0.001 170.315 0.000
/usr/lib64/python2.6/copy.py:144(deepcopy)
13636/13711 39.225 0.003 189.352 0.014
/usr/lib64/python2.6/threading.py:481(Thread.run)
10429451 28.526 0.000 40.548 0.000
/usr/lib64/python2.6/copy.py:261(_keep_alive)
96639/1122019 23.297 0.000 168.826 0.000
/usr/lib64/python2.6/copy.py:251(_deepcopy_dict)
65621 22.852 0.000 75.526 0.001
/usr/share/vdsm/virt/vm.py:2912(Vm._getRunningVmStats)
2566920/2566921 18.205 0.000 26.546 0.000
/usr/share/vdsm/protocoldetector.py:94(MultiProtocolAcceptor._process_events)
100 9.077 0.091 73.731 0.737
/usr/share/vdsm/virt/sampling.py:452(VmStatsThread.collect)
1420035 8.615 0.000 8.615 0.000
/usr/lib/python2.6/site-packages/vdsm/utils.py:424(convertToStr)
27178 6.568 0.000 15.722 0.001
/usr/lib64/python2.6/inspect.py:247(getmembers)
jsonrpc + simplejson 2.0.9 + replaced deepcopy: 29976206 function calls (33600497
primitive calls) in 343.227 CPU seconds
ncalls tottime percall cumtime percall filename:lineno(function)
16504/16584 28.458 0.002 89.572 0.005
/usr/lib64/python2.6/threading.py:481(Thread.run)
68344 24.167 0.000 77.159 0.001
/usr/share/vdsm/virt/vm.py:2911(Vm._getRunningVmStats)
9393/2746299 13.395 0.001 0.210 0.000
/usr/share/vdsm/protocoldetector.py:94(MultiProtocolAcceptor._process_events)
81/100 11.606 0.143 67.946 0.679
/usr/lib/python2.6/site-packages/mom/GuestMonitor.py:51(GuestMonitor.run)
1478844/1478858 9.112 0.000 9.118 0.000
/usr/lib/python2.6/site-packages/vdsm/utils.py:425(convertToStr)
100 7.838 0.078 68.841 0.688
/usr/share/vdsm/virt/sampling.py:452(VmStatsThread.collect)
32923/32924 7.245 0.000 17.585 0.001
/usr/lib64/python2.6/inspect.py:247(getmembers)
68300 5.182 0.000 10.420 0.000
/usr/share/vdsm/virt/vm.py:531(VmStatsThread._getDiskStats)
68344 4.696 0.000 6.360 0.000
/usr/share/vdsm/virt/vm.py:2990(Vm._getGraphicsStats)
806634/806638 4.499 0.000 5.986 0.000
/usr/lib64/python2.6/inspect.py:59(isclass)
+++
[1] which is painfully slow, but this is another topic
[2]
http://lists.ovirt.org/pipermail/devel/2014-November/009208.html
--
Francesco Romani
RedHat Engineering Virtualization R & D
Phone: 8261328
IRC: fromani
_______________________________________________
Devel mailing list
Devel(a)ovirt.org
http://lists.ovirt.org/mailman/listinfo/devel