RPC机制流程

b remoteDomainBlockStats
remoteDomainBlockStats ->call-> callWithFD -> virNetClientProgramCall
-> virNetClientSendWithReply ->virNetClientIO

virNetServerProgramDispatch  ->virNetServerProgramDispatchCall
-> virNetServerProgramGetProc


该目录里有磁盘吞吐量信息。
/sys/devices/xen-backend/vbd-14-51712/statistics

#0  xenHypervisorDomainBlockStats (dom=0x7ff564048a30, path=0x7ff5640a43e0 "xvda", stats=0x7ff56ffc29b0)
    at libxl/libxl_hypervisor.c:71
#1  0x00000000004d627f in libxlDomainBlockStats (dom=0x7ff564048a30, path=0x7ff5640a43e0 "xvda",
    stats=0x7ff56ffc29b0) at libxl/libxl_driver.c:3947
#2  0x00007ff574677aab in virDomainBlockStats (dom=0x7ff564048a30, disk=0x7ff5640a43e0 "xvda", stats=0x7ff56ffc2a80,
    size=40) at libvirt.c:7533
#3  0x000000000044762a in remoteDispatchDomainBlockStats (server=0x7b3710, client=0x7be630, msg=0x7fe9f0,
    rerr=0x7ff56ffc2ba0, args=0x7ff564048a70, ret=0x7ff564038b60) at remote_dispatch.h:721
#4  0x0000000000447762 in remoteDispatchDomainBlockStatsHelper (server=0x7b3710, client=0x7be630, msg=0x7fe9f0,
    rerr=0x7ff56ffc2ba0, args=0x7ff564048a70, ret=0x7ff564038b60) at remote_dispatch.h:697
#5  0x00007ff5746c4aa2 in virNetServerProgramDispatchCall (prog=0x7be7a0, server=0x7b3710, client=0x7be630,
msg=0x7fe9f0) at rpc/virnetserverprogram.c:416
#6  0x00007ff5746c4ed8 in virNetServerProgramDispatch (prog=0x7be7a0, server=0x7b3710, client=0x7be630, msg=0x7fe9f0)
    at rpc/virnetserverprogram.c:289
#7  0x00007ff5746c1899 in virNetServerHandleJob (jobOpaque=0x77be10, opaque=0x7b3710) at rpc/virnetserver.c:164
#8  0x00007ff5745d368d in virThreadPoolWorker (opaque=0x7782f0) at util/threadpool.c:144
#9  0x00007ff5745d2bcf in virThreadHelper (data=0x778270) at util/threads-pthread.c:161
#10 0x00007ff5721a05f0 in start_thread () from /lib64/libpthread.so.0
#11 0x00007ff571b0884d in clone () from /lib64/libc.so.6
#12 0x0000000000000000 in ?? ()

 

 

daemon/remote_dispatch.h中注册remote动作
virNetServerProgramProc remoteProcs[] = {
{ /* Method DomainBlockStats => 64 */
   remoteDispatchDomainBlockStatsHelper,
   sizeof(remote_domain_block_stats_args),
   (xdrproc_t)xdr_remote_domain_block_stats_args,
   sizeof(remote_domain_block_stats_ret),
   (xdrproc_t)xdr_remote_domain_block_stats_ret,
   true,
   0
},

libxl的驱动注册在daemon/libvirtd.c中
static void daemonInitialize(void)
{
# ifdef WITH_LIBXL
    libxlRegister();
# endif

src/libvirt.c中注册了remote驱动
int
virInitialize(void)
{
# ifdef WITH_REMOTE
    virDriverLoadModule("remote");
# endif

 

猜你喜欢

转载自blog.csdn.net/tdaajames/article/details/107518940