From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1It3A9-00013B-HY for qemu-devel@nongnu.org; Fri, 16 Nov 2007 10:31:21 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1It3A7-0000xO-NF for qemu-devel@nongnu.org; Fri, 16 Nov 2007 10:31:20 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1It3A7-0000x1-HT for qemu-devel@nongnu.org; Fri, 16 Nov 2007 10:31:19 -0500 Received: from mx1.redhat.com ([66.187.233.31]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1It3A7-0005zM-2b for qemu-devel@nongnu.org; Fri, 16 Nov 2007 10:31:19 -0500 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.13.8/8.13.1) with ESMTP id lAGFVD7C032380 for ; Fri, 16 Nov 2007 10:31:13 -0500 Received: from pobox.fab.redhat.com (pobox.fab.redhat.com [10.33.63.12]) by int-mx1.corp.redhat.com (8.13.1/8.13.1) with ESMTP id lAGFVCef017751 for ; Fri, 16 Nov 2007 10:31:13 -0500 Received: from oirase.home.annexia.org (vpn-6-13.fab.redhat.com [10.33.6.13]) by pobox.fab.redhat.com (8.13.1/8.13.1) with ESMTP id lAGFVB4d030458 for ; Fri, 16 Nov 2007 10:31:12 -0500 Message-ID: <473DB76C.8050109@redhat.com> Date: Fri, 16 Nov 2007 15:29:48 +0000 From: "Richard W.M. Jones" MIME-Version: 1.0 Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="------------ms040900020406010200030600" Subject: [Qemu-devel] [PATCH] Collecting block device statistics Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org This is a cryptographically signed message in MIME format. --------------ms040900020406010200030600 Content-Type: multipart/mixed; boundary="------------010401090803020302010102" This is a multi-part message in MIME format. --------------010401090803020302010102 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi, I was looking for a way to collect information on the amount of data being written and read from block devices. The attached patch adds a few counters to the BlockDriverState structure to collect this information, and a new "info blockstats" monitor command to display it. This screenshot shows it in action: http://www.annexia.org/tmp/Screenshot-QEMU.png This is the sort of feature I'd really like to see merged into qemu because it will let us enhance libvirt to centrally collect these stats from qemu instances. Any comments or feedback about this are most welcome. Rich. -- Emerging Technologies, Red Hat - http://et.redhat.com/~rjones/ Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod Street, Windsor, Berkshire, SL4 1TE, United Kingdom. Registered in England and Wales under Company Registration No. 03798903 --------------010401090803020302010102 Content-Type: text/x-patch; name="qemu-blockstats.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="qemu-blockstats.patch" Index: block.c =================================================================== RCS file: /sources/qemu/qemu/block.c,v retrieving revision 1.47 diff -u -r1.47 block.c --- block.c 11 Nov 2007 02:51:16 -0000 1.47 +++ block.c 16 Nov 2007 15:23:44 -0000 @@ -522,8 +522,12 @@ return ret; else if (ret != len) return -EINVAL; - else + else { + bs->rd_bytes += (unsigned) len; + bs->rd_sects += (unsigned) nb_sectors; + bs->rd_ops ++; return 0; + } } else { return drv->bdrv_read(bs, sector_num, buf, nb_sectors); } @@ -554,8 +558,12 @@ return ret; else if (ret != len) return -EIO; - else + else { + bs->wr_bytes += (unsigned) len; + bs->wr_sects += (unsigned) nb_sectors; + bs->wr_ops ++; return 0; + } } else { return drv->bdrv_write(bs, sector_num, buf, nb_sectors); } @@ -903,6 +911,27 @@ term_printf("\n"); } } + +/* The "info blockstats" command. */ +void bdrv_info_stats (void) +{ + BlockDriverState *bs; + + for (bs = bdrv_first; bs != NULL; bs = bs->next) { + term_printf ("%s:" + " rd(bytes)=%" PRIu64 + " wr(bytes)=%" PRIu64 + " rd(sectors)=%" PRIu64 + " wr(sectors)=%" PRIu64 + " rd(operations)=%" PRIu64 + " wr(operations)=%" PRIu64 + "\n", + bs->device_name, + bs->rd_bytes, bs->wr_bytes, + bs->rd_sects, bs->wr_sects, + bs->rd_ops, bs->wr_ops); + } +} #endif void bdrv_get_backing_filename(BlockDriverState *bs, @@ -1065,6 +1094,7 @@ BlockDriverCompletionFunc *cb, void *opaque) { BlockDriver *drv = bs->drv; + BlockDriverAIOCB *ret; if (!drv) return NULL; @@ -1077,7 +1107,16 @@ buf += 512; } - return drv->bdrv_aio_read(bs, sector_num, buf, nb_sectors, cb, opaque); + ret = drv->bdrv_aio_read(bs, sector_num, buf, nb_sectors, cb, opaque); + + if (ret) { + /* Update stats even though technically transfer has not happened. */ + bs->rd_bytes += (unsigned) nb_sectors * SECTOR_SIZE; + bs->rd_sects += (unsigned) nb_sectors; + bs->rd_ops ++; + } + + return ret; } BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num, @@ -1085,6 +1124,7 @@ BlockDriverCompletionFunc *cb, void *opaque) { BlockDriver *drv = bs->drv; + BlockDriverAIOCB *ret; if (!drv) return NULL; @@ -1094,7 +1134,16 @@ memcpy(bs->boot_sector_data, buf, 512); } - return drv->bdrv_aio_write(bs, sector_num, buf, nb_sectors, cb, opaque); + ret = drv->bdrv_aio_write(bs, sector_num, buf, nb_sectors, cb, opaque); + + if (ret) { + /* Update stats even though technically transfer has not happened. */ + bs->wr_bytes += (unsigned) nb_sectors * SECTOR_SIZE; + bs->wr_sects += (unsigned) nb_sectors; + bs->wr_ops ++; + } + + return ret; } void bdrv_aio_cancel(BlockDriverAIOCB *acb) Index: block.h =================================================================== RCS file: /sources/qemu/qemu/block.h,v retrieving revision 1.1 diff -u -r1.1 block.h --- block.h 11 Nov 2007 02:51:16 -0000 1.1 +++ block.h 16 Nov 2007 15:23:44 -0000 @@ -48,6 +48,7 @@ #ifndef QEMU_IMG void bdrv_info(void); +void bdrv_info_stats(void); #endif void bdrv_init(void); Index: block_int.h =================================================================== RCS file: /sources/qemu/qemu/block_int.h,v retrieving revision 1.14 diff -u -r1.14 block_int.h --- block_int.h 11 Nov 2007 02:51:16 -0000 1.14 +++ block_int.h 16 Nov 2007 15:23:44 -0000 @@ -114,6 +114,14 @@ void *sync_aiocb; + /* I/O stats (display with "info blockstats"). */ + uint64_t rd_bytes; + uint64_t wr_bytes; + uint64_t rd_sects; + uint64_t wr_sects; + uint64_t rd_ops; + uint64_t wr_ops; + /* NOTE: the following infos are only hints for real hardware drivers. They are not used by the block driver */ int cyls, heads, secs, translation; Index: monitor.c =================================================================== RCS file: /sources/qemu/qemu/monitor.c,v retrieving revision 1.85 diff -u -r1.85 monitor.c --- monitor.c 26 Oct 2007 18:42:57 -0000 1.85 +++ monitor.c 16 Nov 2007 15:23:46 -0000 @@ -249,6 +249,11 @@ bdrv_info(); } +static void do_info_blockstats(void) +{ + bdrv_info_stats(); +} + /* get the current CPU defined by the user */ int mon_set_cpu(int cpu_index) { @@ -1321,6 +1326,8 @@ "", "show the network state" }, { "block", "", do_info_block, "", "show the block devices" }, + { "blockstats", "", do_info_blockstats, + "", "show block device statistics" }, { "registers", "", do_info_registers, "", "show the cpu registers" }, { "cpus", "", do_info_cpus, --------------010401090803020302010102-- --------------ms040900020406010200030600 Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIJAzCC AtwwggJFoAMCAQICEAS4dW+HXx5T2s1p+JnOIgkwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UE BhMCWkExJTAjBgNVBAoTHFRoYXd0ZSBDb25zdWx0aW5nIChQdHkpIEx0ZC4xLDAqBgNVBAMT I1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBJc3N1aW5nIENBMB4XDTA3MDIxOTEwMDIxOFoX DTA4MDIxOTEwMDIxOFowQzEfMB0GA1UEAxMWVGhhd3RlIEZyZWVtYWlsIE1lbWJlcjEgMB4G CSqGSIb3DQEJARYRcmpvbmVzQHJlZGhhdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDPJ872hlyuT89WhxOjsWO6ZmnJXFozZHACO5WRaOGKE63VWbYdrWrW2zhV11ND kiZ5nI2IZoN2sga57/bLs1Wcc3W7VCEQ/vP+YqnzvzBPnt9e1gD/Rte64hiNeP58cGjbzjMx AcBa1ICHzwniYxEP1QAiSu0Hk6ecRiMVVXYxCwa1D46klRkVPtQT89EIXS5Z4EOqQy83UZh/ XdgcsadaRxsgkQNgOif6M1pR149uuW0STunhuaNBz8eNRKFTkmn7Mb+claNdiedViabqgbOt F7NJjPPivv/aBEPb7e2cRa/SSdziRFZUA5w8Kvpr6JQW6cipV2KwnAMJOwhlgjMlAgMBAAGj LjAsMBwGA1UdEQQVMBOBEXJqb25lc0ByZWRoYXQuY29tMAwGA1UdEwEB/wQCMAAwDQYJKoZI hvcNAQEFBQADgYEAwQGFC+ULhnDVOGH/1FhxI7v56HVlKkkXk7Xazf3m/vk3s6lBjrUW9VAe c7f8uGEIRAyDsWQN/yyVxmwRFleEK6UiZFIOVTTH0Pcb5XSibBO5v7y3TILeqtGQcRYJwT0m 1K5LkZobCUGeZgw0KjCFeLzPzlxv7efYBheyJyFoRB4wggLcMIICRaADAgECAhAEuHVvh18e U9rNafiZziIJMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYTAlpBMSUwIwYDVQQKExxUaGF3 dGUgQ29uc3VsdGluZyAoUHR5KSBMdGQuMSwwKgYDVQQDEyNUaGF3dGUgUGVyc29uYWwgRnJl ZW1haWwgSXNzdWluZyBDQTAeFw0wNzAyMTkxMDAyMThaFw0wODAyMTkxMDAyMThaMEMxHzAd BgNVBAMTFlRoYXd0ZSBGcmVlbWFpbCBNZW1iZXIxIDAeBgkqhkiG9w0BCQEWEXJqb25lc0By ZWRoYXQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzyfO9oZcrk/PVocT o7FjumZpyVxaM2RwAjuVkWjhihOt1Vm2Ha1q1ts4VddTQ5ImeZyNiGaDdrIGue/2y7NVnHN1 u1QhEP7z/mKp878wT57fXtYA/0bXuuIYjXj+fHBo284zMQHAWtSAh88J4mMRD9UAIkrtB5On nEYjFVV2MQsGtQ+OpJUZFT7UE/PRCF0uWeBDqkMvN1GYf13YHLGnWkcbIJEDYDon+jNaUdeP brltEk7p4bmjQc/HjUShU5Jp+zG/nJWjXYnnVYmm6oGzrRezSYzz4r7/2gRD2+3tnEWv0knc 4kRWVAOcPCr6a+iUFunIqVdisJwDCTsIZYIzJQIDAQABoy4wLDAcBgNVHREEFTATgRFyam9u ZXNAcmVkaGF0LmNvbTAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBBQUAA4GBAMEBhQvlC4Zw 1Thh/9RYcSO7+eh1ZSpJF5O12s395v75N7OpQY61FvVQHnO3/LhhCEQMg7FkDf8slcZsERZX hCulImRSDlU0x9D3G+V0omwTub+8t0yC3qrRkHEWCcE9JtSuS5GaGwlBnmYMNCowhXi8z85c b+3n2AYXsichaEQeMIIDPzCCAqigAwIBAgIBDTANBgkqhkiG9w0BAQUFADCB0TELMAkGA1UE BhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl cyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVtYWlsIENBMSswKQYJ KoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUuY29tMB4XDTAzMDcxNzAwMDAw MFoXDTEzMDcxNjIzNTk1OVowYjELMAkGA1UEBhMCWkExJTAjBgNVBAoTHFRoYXd0ZSBDb25z dWx0aW5nIChQdHkpIEx0ZC4xLDAqBgNVBAMTI1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBJ c3N1aW5nIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEpjxVc1X7TrnKmVoeaMB1 BHCd3+n/ox7svc31W/Iadr1/DDph8r9RzgHU5VAKMNcCY1osiRVwjt3J8CuFWqo/cVbLrzwL B+fxH5E2JCoTzyvV84J3PQO+K/67GD4Hv0CAAmTXp6a7n2XRxSpUhQ9IBH+nttE8YQRAHmQZ cmC3+wIDAQABo4GUMIGRMBIGA1UdEwEB/wQIMAYBAf8CAQAwQwYDVR0fBDwwOjA4oDagNIYy aHR0cDovL2NybC50aGF3dGUuY29tL1RoYXd0ZVBlcnNvbmFsRnJlZW1haWxDQS5jcmwwCwYD VR0PBAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFQcml2YXRlTGFiZWwyLTEzODAN BgkqhkiG9w0BAQUFAAOBgQBIjNFQg+oLLswNo2asZw9/r6y+whehQ5aUnX9MIbj4Nh+qLZ82 L8D0HFAgk3A8/a3hYWLD2ToZfoSxmRsAxRoLgnSeJVCUYsfbJ3FXJY3dqZw5jowgT2Vfldr3 94fWxghOrvbqNOUQGls1TXfjViF4gtwhGTXeJLHTHUb/XV9lTzGCA2QwggNgAgEBMHYwYjEL MAkGA1UEBhMCWkExJTAjBgNVBAoTHFRoYXd0ZSBDb25zdWx0aW5nIChQdHkpIEx0ZC4xLDAq BgNVBAMTI1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBJc3N1aW5nIENBAhAEuHVvh18eU9rN afiZziIJMAkGBSsOAwIaBQCgggHDMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI hvcNAQkFMQ8XDTA3MTExNjE1Mjk0OFowIwYJKoZIhvcNAQkEMRYEFJyZJFSWvfiECbPntGvh 5kMA1+EHMFIGCSqGSIb3DQEJDzFFMEMwCgYIKoZIhvcNAwcwDgYIKoZIhvcNAwICAgCAMA0G CCqGSIb3DQMCAgFAMAcGBSsOAwIHMA0GCCqGSIb3DQMCAgEoMIGFBgkrBgEEAYI3EAQxeDB2 MGIxCzAJBgNVBAYTAlpBMSUwIwYDVQQKExxUaGF3dGUgQ29uc3VsdGluZyAoUHR5KSBMdGQu MSwwKgYDVQQDEyNUaGF3dGUgUGVyc29uYWwgRnJlZW1haWwgSXNzdWluZyBDQQIQBLh1b4df HlPazWn4mc4iCTCBhwYLKoZIhvcNAQkQAgsxeKB2MGIxCzAJBgNVBAYTAlpBMSUwIwYDVQQK ExxUaGF3dGUgQ29uc3VsdGluZyAoUHR5KSBMdGQuMSwwKgYDVQQDEyNUaGF3dGUgUGVyc29u YWwgRnJlZW1haWwgSXNzdWluZyBDQQIQBLh1b4dfHlPazWn4mc4iCTANBgkqhkiG9w0BAQEF AASCAQAUTBfL0piewg86DzDH2H/S+lqbGRHwFeCipvBWnpiPKndSEZUZRDUJFtP8X5TnHMB+ p3K9FesiPaiwcFnXEThWfAnNKP6teIzIn5cGOimo3KWlwhIjm6auuGfKAnKlpbgcbuhFAgXY 1ZCFMMatfd2+DKE1uXuCbxGmXWI52c3bHYt+wxRiueH7Khdj5r9jkvVy5hh5s3WSUVEbPwgx NK9Dl8X7/3qzIoWIbAlUGksNHhL1knuHOV8+MOTc3tHg9r9TEnrT/Dd5bgJSi9OHmZC4daSR MjrVwXIhLm7isGneQi4JVZNMTwG7ROn9kUYdSnq3juRbbldNAJu0IN/C5yPGAAAAAAAA --------------ms040900020406010200030600--