[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] qemu-dm performance



On Wed, Sep 20, 2006 at 04:01:44PM -0400, Tommie McAfee wrote:
> Also, where else should I look in the code for possible explanations to
> why qemu-dm uses 20% CPU simply to view a guest.  All comments and
> suggestions regarding this matter are appreciated,

Rather than looking at the code, try using a profiling tool like OProfile
to instrument exactly where the runtime is going. For example running it
against qemu-dm instance on my Fedora Core 6 Xen host shows the following
top hot-spots:

# opcontrol --setup --separate=library,kernel \
     --vmlinux=/usr/lib/debug/lib/modules/2.6.17-1.2647.fc6/vmlinux \
     -e CPU_CLK_UNHALTED:100000:
# opcontrol --start
# opreport /usr/lib64/xen/bin/qemu-dm -a -l 2>/dev/null | head -7
Counted CPU_CLK_UNHALTED events (Cycles outside of halt state) with a unit mask 
of 0x00 (No unit mask) count 100000
samples  cum. samples  %        cum. %     image name               symbol name
391713   391713        56.1887  56.1887    qemu-dm                  vram_dirty
202108   593821        28.9911  85.1798    qemu-dm                  
_vnc_update_client
99266    693087        14.2391  99.4189    qemu-dm                  
vga_draw_line24_32
2023     695110         0.2902  99.7091    qemu-dm                  
vga_update_display

Fortunately this profile shows some clear hotspots to examine in greater
details - 3 sxamples accounting for 98% of all CPU time in qemu-dm
This is with a single VNC client connected, but not actively doing anything
in the guest framebuffer, using RHEL-3 as the fully-virt guest. 

If you have debuginfo available you can even get source file annotations
of where the hits are. For example, taking the 2nd hit there:

# opannotate /usr/lib64/xen/bin/qemu-dm --source -i _vnc_update_client 
....snip start of source....
 14800  1.5009 :                for (x = 0; x < X2DP_UP(vs, vs->ds->width); 
x++) {
  9928  1.0068 :                    if (vs->dirty_row[y] & (1ULL << x)) {
936343 94.9594 :                        if (memcmp(old_ptr, ptr, tile_bytes)) {
               :                            vs->has_update = 1;
     1 1.0e-04 :                            vs->update_row[y] |= (1ULL << x);
               :                            memcpy(old_ptr, ptr, tile_bytes);
               :                        }
 14513  1.4718 :                        vs->dirty_row[y] &= ~(1ULL << x);
               :                    }
               :
  4742  0.4809 :                    ptr += tile_bytes;
               :                    old_ptr += tile_bytes;
               :                }
......snip rest of source....

Regards,
Dan.
-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.