* bcache-tools package for Fedora
@ 2013-08-25 19:07 Rolf Fokkens
[not found] ` <521A55D4.20908-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>
0 siblings, 1 reply; 23+ messages in thread
From: Rolf Fokkens @ 2013-08-25 19:07 UTC (permalink / raw)
To: linux-bcache-u79uwXL29TY76Z2rM5mHXA
Hi!
To allow Fedora users to benefit from bcache I'm currently packaging
bcache-tools for Fedora.
See also: https://bugzilla.redhat.com/show_bug.cgi?id=999690
Any suggestions or other feedback is welcome. Whenever I run into
something relevant, I'll share it with the mail list.
Rolf Fokkens
^ permalink raw reply [flat|nested] 23+ messages in thread[parent not found: <521A55D4.20908-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>]
* Re: [RFC] bcache-status [not found] ` <521A55D4.20908-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> @ 2013-08-25 20:39 ` Rolf Fokkens [not found] ` <521A6B92.60001-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> 2013-09-05 6:53 ` bcache-tools package for Fedora / status probe-bcache Rolf Fokkens 1 sibling, 1 reply; 23+ messages in thread From: Rolf Fokkens @ 2013-08-25 20:39 UTC (permalink / raw) To: linux-bcache-u79uwXL29TY76Z2rM5mHXA Hi, I took the liberty of adding bcache-status to the bcache-tools package I'm building: https://bugzilla.redhat.com/show_bug.cgi?id=999690#c12 I have a few questions/remarks: - Is the python3 dependency really needed? I changed it to ordinary python(2) and it runs fine I think. - Is https://gist.github.com/damoxc/6267899 the proper source? - When the bcache kernel module is not loaded, the feedback looks buggy: [root@home07 ~]# bcache-status Traceback (most recent call last): File "/sbin/bcache-status", line 348, in <module> main() File "/sbin/bcache-status", line 333, in main for cache in os.listdir(SYSFS_BCACHE_PATH): OSError: [Errno 2] No such file or directory: '/sys/fs/bcache/' [root@home07 ~]# Rolf On 08/25/2013 09:07 PM, Rolf Fokkens wrote: > To allow Fedora users to benefit from bcache I'm currently packaging > bcache-tools for Fedora. > > See also: https://bugzilla.redhat.com/show_bug.cgi?id=999690 ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <521A6B92.60001-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>]
* Re: [RFC] bcache-status [not found] ` <521A6B92.60001-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> @ 2013-08-26 16:30 ` Darrick J. Wong [not found] ` <20130826163055.GB4780-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Darrick J. Wong @ 2013-08-26 16:30 UTC (permalink / raw) To: Rolf Fokkens; +Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA On Sun, Aug 25, 2013 at 10:39:46PM +0200, Rolf Fokkens wrote: > Hi, > > I took the liberty of adding bcache-status to the bcache-tools > package I'm building: Yay! :) > https://bugzilla.redhat.com/show_bug.cgi?id=999690#c12 > > I have a few questions/remarks: > - Is the python3 dependency really needed? I changed it to ordinary > python(2) and it runs fine I think. Not required; I'm merely writing new scripts in python3. (At least when I can find py3 libraries...) I didn't write anything py3-specific, as far as I know. > - Is https://gist.github.com/damoxc/6267899 the proper source? I was hoping someone will (eventually) commit the status tool to bcache-tools.git. For now, there's: https://gist.github.com/djwong/6343451 in which I've merged all the changes made by the two people who (thank you both!) provided modifications. > - When the bcache kernel module is not loaded, the feedback looks buggy: > [root@home07 ~]# bcache-status > Traceback (most recent call last): > File "/sbin/bcache-status", line 348, in <module> > main() > File "/sbin/bcache-status", line 333, in main > for cache in os.listdir(SYSFS_BCACHE_PATH): > OSError: [Errno 2] No such file or directory: '/sys/fs/bcache/' > [root@home07 ~]# Yeah, I fixed that before posting the gist. :) --D > > Rolf > > On 08/25/2013 09:07 PM, Rolf Fokkens wrote: > >To allow Fedora users to benefit from bcache I'm currently > >packaging bcache-tools for Fedora. > > > >See also: https://bugzilla.redhat.com/show_bug.cgi?id=999690 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-bcache" in > the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <20130826163055.GB4780-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org>]
* Re: [RFC] bcache-status [not found] ` <20130826163055.GB4780-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org> @ 2013-08-26 20:36 ` Rolf Fokkens [not found] ` <521BBC3B.9010003-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> 2013-08-26 23:01 ` Rolf Fokkens 1 sibling, 1 reply; 23+ messages in thread From: Rolf Fokkens @ 2013-08-26 20:36 UTC (permalink / raw) To: Darrick J. Wong; +Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA On 08/26/2013 06:30 PM, Darrick J. Wong wrote: > https://bugzilla.redhat.com/show_bug.cgi?id=999690#c12 > > I have a few questions/remarks: > - Is the python3 dependency really needed? I changed it to ordinary > python(2) and it runs fine I think. > Not required; I'm merely writing new scripts in python3. (At least when I can > find py3 libraries...) I didn't write anything py3-specific, as far as I know. Would you consider putting python in the header instead of python3? Having python3 in the heading adds the requirement to install python3, and I think python2 is (still) more standard. For Fedora 20 I think it is anyway, which means I have to patch it everytime I want to package it. > For now, there's: https://gist.github.com/djwong/6343451 in which I've merged > all the changes made by the two people who (thank you both!) provided > modifications. > > Yeah, I fixed that before posting the gist. :) --D Thanks, I'll update the package! ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <521BBC3B.9010003-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>]
* Re: [RFC] bcache-status [not found] ` <521BBC3B.9010003-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> @ 2013-08-29 0:46 ` Darrick J. Wong [not found] ` <20130829004646.GA3099-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Darrick J. Wong @ 2013-08-29 0:46 UTC (permalink / raw) To: Rolf Fokkens; +Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA On Mon, Aug 26, 2013 at 10:36:11PM +0200, Rolf Fokkens wrote: > On 08/26/2013 06:30 PM, Darrick J. Wong wrote: > >https://bugzilla.redhat.com/show_bug.cgi?id=999690#c12 > > > >I have a few questions/remarks: > >- Is the python3 dependency really needed? I changed it to ordinary > >python(2) and it runs fine I think. > >Not required; I'm merely writing new scripts in python3. (At least when I can > >find py3 libraries...) I didn't write anything py3-specific, as far as I know. > Would you consider putting python in the header instead of python3? > Having python3 in the heading adds the requirement to install > python3, and I think python2 is (still) more standard. For Fedora 20 > I think it is anyway, which means I have to patch it everytime I > want to package it. Sure. Go ahead and take the '3' out of hashbang. (Gist updated.) --D > >For now, there's: https://gist.github.com/djwong/6343451 in which I've merged > >all the changes made by the two people who (thank you both!) provided > >modifications. > > > >Yeah, I fixed that before posting the gist. :) --D > Thanks, I'll update the package! > ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <20130829004646.GA3099-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org>]
* Re: [RFC] bcache-status [not found] ` <20130829004646.GA3099-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org> @ 2013-09-03 20:46 ` Rolf Fokkens [not found] ` <52264AAD.3050401-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Rolf Fokkens @ 2013-09-03 20:46 UTC (permalink / raw) To: Darrick J. Wong; +Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA Hi, bcache-status renders some weird output: - "Total Cache Used" and "Total Cache Unused" don't always add up to "Total Cache Size" - "Dirty Data" is -6 MB? Seems like bugs to me. Details below. Rolf [root@localhost bcache]# bcache-status -s --- bcache --- UUID c318c0b2-0b69-4f66-a729-23b82a9d0e91 Block Size 0.00KiB Bucket Size 512.00KiB Congested? False Read Congestion 2.0ms Write Congestion 20.0ms Total Cache Size 1.00GiB Total Cache Used 20.00MiB (1%) Total Cache Unused 1.00GiB (99%) Dirty Data 0B (0%) Evictable Cache 1.00GiB (100%) Replacement Policy [lru] fifo random Cache Mode [writethrough] writeback writearound none Total Hits 122 (100%) Total Misses 0 Total Bypass Hits 0 Total Bypass Misses 0 Total Bypassed 0B --- Backing Device --- Device File /dev/sda3 (8:3) bcache Device File /dev/bcache1 (252:1) Size 7.00GiB Cache Mode [writethrough] writeback writearound none Readahead 0 Sequential Cutoff 4.00MiB Merge sequential? True State clean Writeback? True Dirty Data 0B Total Hits 122 (100%) Total Misses 0 Total Bypass Hits 0 Total Bypass Misses 0 Total Bypassed 0B --- Cache Device --- Device File /dev/sdb1 (8:17) Size 1.00GiB Block Size 0.00KiB Bucket Size 512.00KiB Replacement Policy [lru] fifo random Discard? False I/O Errors 0 Metadata Written 1.00KiB Data Written 0B Buckets 4094 Cache Used 20.00MiB (1%) Cache Unused 1.00GiB (99%) --- bcache --- UUID d07cd9a1-6211-4bba-bc37-a8ba8858ef4d Block Size 0.00KiB Bucket Size 512.00KiB Congested? False Read Congestion 2.0ms Write Congestion 20.0ms Total Cache Size 1.00GiB Total Cache Used 204.00MiB (10%) Total Cache Unused 1.00GiB (90%) Dirty Data 0B (0%) Evictable Cache 1.00GiB (100%) Replacement Policy [lru] fifo random Cache Mode writethrough [writeback] writearound none Total Hits 1365 (81%) Total Misses 318 Total Bypass Hits 3191 (100%) Total Bypass Misses 0 Total Bypassed 46.00MiB --- Backing Device --- Device File /dev/sdc1 (8:33) bcache Device File /dev/bcache0 (252:0) Size 19.00GiB Cache Mode writethrough [writeback] writearound none Readahead 0 Sequential Cutoff 0B Merge sequential? True State dirty Writeback? True Dirty Data -6.00MiB Total Hits 1365 (81%) Total Misses 318 Total Bypass Hits 3191 (100%) Total Bypass Misses 0 Total Bypassed 46.00MiB --- Cache Device --- Device File /dev/sdd1 (8:49) Size 1.00GiB Block Size 0.00KiB Bucket Size 512.00KiB Replacement Policy [lru] fifo random Discard? False I/O Errors 0 Metadata Written 281.00KiB Data Written 18.00MiB Buckets 4094 Cache Used 204.00MiB (10%) Cache Unused 1.00GiB (90%) [root@localhost bcache]# ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <52264AAD.3050401-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>]
* Re: [RFC] bcache-status [not found] ` <52264AAD.3050401-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> @ 2013-09-04 20:26 ` Darrick J. Wong [not found] ` <20130904202600.GA4554-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Darrick J. Wong @ 2013-09-04 20:26 UTC (permalink / raw) To: Rolf Fokkens; +Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA On Tue, Sep 03, 2013 at 10:46:37PM +0200, Rolf Fokkens wrote: > Hi, > > bcache-status renders some weird output: > > - "Total Cache Used" and "Total Cache Unused" don't always add up to > "Total Cache Size" Yeah... I calculate total cache size, then cache-used = cache-size * whatever percentage bcache reports. It won't add up exactly due to rounding errors. 0.999 -> 1.00. That's rather a lot, really. > - "Dirty Data" is -6 MB? I think this was fixed in 3.11. --D > > Seems like bugs to me. Details below. > > Rolf > > [root@localhost bcache]# bcache-status -s > --- bcache --- > UUID c318c0b2-0b69-4f66-a729-23b82a9d0e91 > Block Size 0.00KiB > Bucket Size 512.00KiB > Congested? False > Read Congestion 2.0ms > Write Congestion 20.0ms > Total Cache Size 1.00GiB > Total Cache Used 20.00MiB (1%) > Total Cache Unused 1.00GiB (99%) > Dirty Data 0B (0%) > Evictable Cache 1.00GiB (100%) > Replacement Policy [lru] fifo random > Cache Mode [writethrough] writeback writearound none > Total Hits 122 (100%) > Total Misses 0 > Total Bypass Hits 0 > Total Bypass Misses 0 > Total Bypassed 0B > --- Backing Device --- > Device File /dev/sda3 (8:3) > bcache Device File /dev/bcache1 (252:1) > Size 7.00GiB > Cache Mode [writethrough] writeback writearound none > Readahead 0 > Sequential Cutoff 4.00MiB > Merge sequential? True > State clean > Writeback? True > Dirty Data 0B > Total Hits 122 (100%) > Total Misses 0 > Total Bypass Hits 0 > Total Bypass Misses 0 > Total Bypassed 0B > --- Cache Device --- > Device File /dev/sdb1 (8:17) > Size 1.00GiB > Block Size 0.00KiB > Bucket Size 512.00KiB > Replacement Policy [lru] fifo random > Discard? False > I/O Errors 0 > Metadata Written 1.00KiB > Data Written 0B > Buckets 4094 > Cache Used 20.00MiB (1%) > Cache Unused 1.00GiB (99%) > --- bcache --- > UUID d07cd9a1-6211-4bba-bc37-a8ba8858ef4d > Block Size 0.00KiB > Bucket Size 512.00KiB > Congested? False > Read Congestion 2.0ms > Write Congestion 20.0ms > Total Cache Size 1.00GiB > Total Cache Used 204.00MiB (10%) > Total Cache Unused 1.00GiB (90%) > Dirty Data 0B (0%) > Evictable Cache 1.00GiB (100%) > Replacement Policy [lru] fifo random > Cache Mode writethrough [writeback] writearound none > Total Hits 1365 (81%) > Total Misses 318 > Total Bypass Hits 3191 (100%) > Total Bypass Misses 0 > Total Bypassed 46.00MiB > --- Backing Device --- > Device File /dev/sdc1 (8:33) > bcache Device File /dev/bcache0 (252:0) > Size 19.00GiB > Cache Mode writethrough [writeback] writearound none > Readahead 0 > Sequential Cutoff 0B > Merge sequential? True > State dirty > Writeback? True > Dirty Data -6.00MiB > Total Hits 1365 (81%) > Total Misses 318 > Total Bypass Hits 3191 (100%) > Total Bypass Misses 0 > Total Bypassed 46.00MiB > --- Cache Device --- > Device File /dev/sdd1 (8:49) > Size 1.00GiB > Block Size 0.00KiB > Bucket Size 512.00KiB > Replacement Policy [lru] fifo random > Discard? False > I/O Errors 0 > Metadata Written 281.00KiB > Data Written 18.00MiB > Buckets 4094 > Cache Used 204.00MiB (10%) > Cache Unused 1.00GiB (90%) > [root@localhost bcache]# > ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <20130904202600.GA4554-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org>]
* Re: [RFC] bcache-status [not found] ` <20130904202600.GA4554-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org> @ 2013-09-04 20:52 ` Rolf Fokkens [not found] ` <52279DA5.7050505-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Rolf Fokkens @ 2013-09-04 20:52 UTC (permalink / raw) To: Darrick J. Wong; +Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA I'm not sure if I understand. On 09/04/2013 10:26 PM, Darrick J. Wong wrote: > Yeah... I calculate total cache size, then cache-used = cache-size * whatever > percentage bcache reports. It won't add up exactly due to rounding errors. > 0.999 -> 1.00. That's rather a lot, really. Is the following (snippet of the output I sent) the result of rounding errors? Total Cache Size 1.00GiB Total Cache Used 204.00MiB (10%) Total Cache Unused 1.00GiB (90%) I mean: the percentages are 10% and 90%.. >> - "Dirty Data" is -6 MB? > I think this was fixed in 3.11. OK, so that is a kernel issue. ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <52279DA5.7050505-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>]
* Re: [RFC] bcache-status [not found] ` <52279DA5.7050505-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> @ 2013-09-05 6:14 ` Stefan Priebe - Profihost AG 2013-09-09 22:45 ` Darrick J. Wong 1 sibling, 0 replies; 23+ messages in thread From: Stefan Priebe - Profihost AG @ 2013-09-05 6:14 UTC (permalink / raw) To: Rolf Fokkens Cc: Darrick J. Wong, linux-bcache-u79uwXL29TY76Z2rM5mHXA, Kent Overstreet Am 04.09.2013 22:52, schrieb Rolf Fokkens: > I'm not sure if I understand. > > On 09/04/2013 10:26 PM, Darrick J. Wong wrote: >> Yeah... I calculate total cache size, then cache-used = cache-size * >> whatever >> percentage bcache reports. It won't add up exactly due to rounding >> errors. >> 0.999 -> 1.00. That's rather a lot, really. > Is the following (snippet of the output I sent) the result of rounding > errors? > > Total Cache Size 1.00GiB > Total Cache Used 204.00MiB (10%) > Total Cache Unused 1.00GiB (90%) > > I mean: the percentages are 10% and 90%.. > >>> - "Dirty Data" is -6 MB? >> I think this was fixed in 3.11. > OK, so that is a kernel issue. Any chance to get this fixed in 3.10 stable kernel too? Stefan ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [RFC] bcache-status [not found] ` <52279DA5.7050505-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> 2013-09-05 6:14 ` Stefan Priebe - Profihost AG @ 2013-09-09 22:45 ` Darrick J. Wong 1 sibling, 0 replies; 23+ messages in thread From: Darrick J. Wong @ 2013-09-09 22:45 UTC (permalink / raw) To: Rolf Fokkens; +Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA On Wed, Sep 04, 2013 at 10:52:53PM +0200, Rolf Fokkens wrote: > I'm not sure if I understand. > > On 09/04/2013 10:26 PM, Darrick J. Wong wrote: > >Yeah... I calculate total cache size, then cache-used = cache-size * whatever > >percentage bcache reports. It won't add up exactly due to rounding errors. > >0.999 -> 1.00. That's rather a lot, really. > Is the following (snippet of the output I sent) the result of > rounding errors? > > Total Cache Size 1.00GiB > Total Cache Used 204.00MiB (10%) > Total Cache Unused 1.00GiB (90%) > > I mean: the percentages are 10% and 90%.. Oops, this was a Py3 v. Py2 issue -- Python3 saw the '%.2f' in the function that pretty-printed cache sizes and would fp-divide the two integers, whereas Pyhon2 saw that we were trying to divide two integers and used integer division. Fixed in the Gist. Kent: Any chance you'd like to pick up bcache-status into bcache-tools.git? (Or really, anyone who has commit access to that repo.) --D > > >>- "Dirty Data" is -6 MB? > >I think this was fixed in 3.11. > OK, so that is a kernel issue. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [RFC] bcache-status [not found] ` <20130826163055.GB4780-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org> 2013-08-26 20:36 ` Rolf Fokkens @ 2013-08-26 23:01 ` Rolf Fokkens 1 sibling, 0 replies; 23+ messages in thread From: Rolf Fokkens @ 2013-08-26 23:01 UTC (permalink / raw) To: Darrick J. Wong; +Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA On 08/26/2013 06:30 PM, Darrick J. Wong wrote: > > I was hoping someone will (eventually) commit the status tool to > bcache-tools.git. Because packaging for Fedora requires it, I created a man page for bcache-status: http://bdsync.rolf-fokkens.nl/bcache-tools-0-0.7.20130820git/bcache-status.8 maybe this helps to get it in the bcache-tools git. Another argument: It's a very useful tool, users will like it! ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: bcache-tools package for Fedora / status probe-bcache [not found] ` <521A55D4.20908-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> 2013-08-25 20:39 ` [RFC] bcache-status Rolf Fokkens @ 2013-09-05 6:53 ` Rolf Fokkens [not found] ` <52282A87.4000801-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> 1 sibling, 1 reply; 23+ messages in thread From: Rolf Fokkens @ 2013-09-05 6:53 UTC (permalink / raw) To: linux-bcache-u79uwXL29TY76Z2rM5mHXA Hi, Packaging is progressing well, an initial package is available: https://admin.fedoraproject.org/updates/bcache-tools-0-0.9.20130827git.fc20 probe-bcache is part of this package, but util-linux will obsolete this shortly: https://bugzilla.redhat.com/show_bug.cgi?id=1001120#c13 Actually the blkid utility in util-linux will do a more thorough job on identifying bcache, e.g. by also checking the csum. Having blkid identify bcache also simplifies the bcache udev rules. So now I'm wondering: are there any particular reasons to keep probe-bcache part of the package, or will it really be obsolete? Rolf On 08/25/2013 09:07 PM, Rolf Fokkens wrote: > Hi! > > To allow Fedora users to benefit from bcache I'm currently packaging > bcache-tools for Fedora. > > See also: https://bugzilla.redhat.com/show_bug.cgi?id=999690 > > Any suggestions or other feedback is welcome. Whenever I run into > something relevant, I'll share it with the mail list. > > Rolf Fokkens > ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <52282A87.4000801-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>]
* Re: bcache-tools package for Fedora / status probe-bcache [not found] ` <52282A87.4000801-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> @ 2013-09-05 10:16 ` Gabriel de Perthuis [not found] ` <52285A03.7080802-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Gabriel de Perthuis @ 2013-09-05 10:16 UTC (permalink / raw) To: Rolf Fokkens; +Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA > Hi, > > Packaging is progressing well, an initial package is available: > https://admin.fedoraproject.org/updates/bcache-tools-0-0.9.20130827git.fc20 > > probe-bcache is part of this package, but util-linux will obsolete > this shortly: https://bugzilla.redhat.com/show_bug.cgi?id=1001120#c13 > Actually the blkid utility in util-linux will do a more thorough job > on identifying bcache, e.g. by also checking the csum. Having blkid > identify bcache also simplifies the bcache udev rules. I'm not a fan of a blkid csum check (I pointed it out on the bug[1]). If a superblock gets scribbled or corrupted, you want bcache to complain, and you don't want blkid to look for the next possible signature. > So now I'm wondering: are there any particular reasons to keep > probe-bcache part of the package, or will it really be obsolete? If you address the above and tweak the udev rules, why not. The upstream repo will need to keep probe-bcache for a while longer, because we don't have a way to require a sufficiently recent libblkid. [1] https://bugzilla.redhat.com/show_bug.cgi?id=1001120#c9 ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <52285A03.7080802-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: bcache-tools package for Fedora / status probe-bcache [not found] ` <52285A03.7080802-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2013-09-05 10:36 ` Rolf Fokkens [not found] ` <FEBD3400-93F1-4286-8BE8-45D5413C2EA2-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Rolf Fokkens @ 2013-09-05 10:36 UTC (permalink / raw) To: Gabriel de Perthuis; +Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org > > I'm not a fan of a blkid csum check (I pointed it out on the bug[1]). > If a superblock gets scribbled or corrupted, you want bcache to > complain, and you don't want blkid to look for the next possible > signature. Having blkid also verify the csum was requested by Karel Zak, the maintainer of util-linux. As a packager of bcache-tools I'm in favour of having blkid identify bcache, but I don't have a preference on using csum to identify bcache. I can pass the message to Karel, but it would be better if we both discuss it on the appropriate (util-linux?) mail list. > >> So now I'm wondering: are there any particular reasons to keep >> probe-bcache part of the package, or will it really be obsolete? > > If you address the above and tweak the udev rules, why not. > > The upstream repo will need to keep probe-bcache for a while > longer, because we don't have a way to require a sufficiently > recent libblkid. I agree, f20 is a specific case, but in general probe-bcache will be needed for a while. > [1] https://bugzilla.redhat.com/show_bug.cgi?id=1001120#c9 ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <FEBD3400-93F1-4286-8BE8-45D5413C2EA2-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>]
* Re: bcache-tools package for Fedora / status probe-bcache [not found] ` <FEBD3400-93F1-4286-8BE8-45D5413C2EA2-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org> @ 2013-09-05 10:53 ` Gabriel de Perthuis [not found] ` <52286299.7000708-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Gabriel de Perthuis @ 2013-09-05 10:53 UTC (permalink / raw) To: Karel Zak Cc: Rolf Fokkens, linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, util-linux >> I'm not a fan of a blkid csum check (I pointed it out on the >> bug[1]). If a superblock gets scribbled or corrupted, you want >> bcache to complain, and you don't want blkid to look for the next >> possible signature. > > Having blkid also verify the csum was requested by Karel Zak, the > maintainer of util-linux. As a packager of bcache-tools I'm in favour > of having blkid identify bcache, but I don't have a preference on > using csum to identify bcache. I can pass the message to Karel, but > it would be better if we both discuss it on the appropriate > (util-linux?) mail list. Karel, are you okay if blkid doesn't do the csum verification discussed above? Checksum failures will be reported by the kernel instead. Alternatively, do you see a way libblkid can return good magic / bad checksum results? >>> So now I'm wondering: are there any particular reasons to keep >>> probe-bcache part of the package, or will it really be obsolete? >> >> If you address the above and tweak the udev rules, why not. >> >> The upstream repo will need to keep probe-bcache for a while >> longer, because we don't have a way to require a sufficiently >> recent libblkid. > > I agree, f20 is a specific case, but in general probe-bcache will be > needed for a while. For the record, the libblkid patch is a good thing in the long run: common interface, less forks in udev. >> [1] https://bugzilla.redhat.com/show_bug.cgi?id=1001120#c9 -- To unsubscribe from this list: send the line "unsubscribe util-linux" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <52286299.7000708-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: bcache-tools package for Fedora / status probe-bcache [not found] ` <52286299.7000708-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2013-09-09 13:26 ` Karel Zak [not found] ` <20130909132653.GA8061-s5vVilr7EKH/9pzu0YdTqQ@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Karel Zak @ 2013-09-09 13:26 UTC (permalink / raw) To: Gabriel de Perthuis Cc: Rolf Fokkens, linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, util-linux On Thu, Sep 05, 2013 at 12:53:13PM +0200, Gabriel de Perthuis wrote: > >> I'm not a fan of a blkid csum check (I pointed it out on the > >> bug[1]). If a superblock gets scribbled or corrupted, you want > >> bcache to complain, and you don't want blkid to look for the next > >> possible signature. > > > > Having blkid also verify the csum was requested by Karel Zak, the > > maintainer of util-linux. As a packager of bcache-tools I'm in favour > > of having blkid identify bcache, but I don't have a preference on > > using csum to identify bcache. I can pass the message to Karel, but > > it would be better if we both discuss it on the appropriate > > (util-linux?) mail list. > > Karel, are you okay if blkid doesn't do the csum verification discussed above? I don't insist on csum, but I'd like to have something more robust than check for a magic string only. It's usually better if there is some additional thing (for example within superblock offset, csum, etc.) -- checksums are ideal because it usually verifies whole superblock (header). > Checksum failures will be reported by the kernel instead. I don't care about kernel :-) The important is what userspace (udev) thinks about the device -- is it correct to trigger any action on broken bcache device or the device should be ignored by userspace rules? > Alternatively, do you see a way libblkid can return good magic / bad checksum > results? If I good understand your patches then it makes wipefs(8) more "hungry" to zap incomplete superblock. I have no problem to support this scenario. Something else (like report bad checksums to udev) is probably unnecessary. Right? > > I agree, f20 is a specific case, but in general probe-bcache will be > > needed for a while. > > For the record, the libblkid patch is a good thing in the long run: > common interface, less forks in udev. Yes, definitely. Maybe we can backport the patch to F20 if you need it -- it's not too invasive change. Karel -- Karel Zak <kzak-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> http://karelzak.blogspot.com -- To unsubscribe from this list: send the line "unsubscribe util-linux" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <20130909132653.GA8061-s5vVilr7EKH/9pzu0YdTqQ@public.gmane.org>]
* Re: bcache-tools package for Fedora / status probe-bcache [not found] ` <20130909132653.GA8061-s5vVilr7EKH/9pzu0YdTqQ@public.gmane.org> @ 2013-09-09 15:28 ` Gabriel de Perthuis [not found] ` <522DE939.5090009-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Gabriel de Perthuis @ 2013-09-09 15:28 UTC (permalink / raw) To: Karel Zak Cc: Rolf Fokkens, linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, util-linux lun. 09 sept. 2013 15:26:53 CEST, Karel Zak a écrit : > On Thu, Sep 05, 2013 at 12:53:13PM +0200, Gabriel de Perthuis wrote: >>>> I'm not a fan of a blkid csum check (I pointed it out on the >>>> bug[1]). If a superblock gets scribbled or corrupted, you want >>>> bcache to complain, and you don't want blkid to look for the next >>>> possible signature. >>> >>> Having blkid also verify the csum was requested by Karel Zak, the >>> maintainer of util-linux. As a packager of bcache-tools I'm in favour >>> of having blkid identify bcache, but I don't have a preference on >>> using csum to identify bcache. I can pass the message to Karel, but >>> it would be better if we both discuss it on the appropriate >>> (util-linux?) mail list. >> >> Karel, are you okay if blkid doesn't do the csum verification discussed above? > > I don't insist on csum, but I'd like to have something more robust > than check for a magic string only. It's usually better if there > is some additional thing (for example within superblock offset, > csum, etc.) -- checksums are ideal because it usually verifies > whole superblock (header). > >> Checksum failures will be reported by the kernel instead. > > I don't care about kernel :-) The important is what userspace (udev) > thinks about the device -- is it correct to trigger any action on > broken bcache device or the device should be ignored by userspace > rules? It's correct insofar as current consumers expect it, and it's better for error reporting. The patches took care of my other objections, so you can keep the crc check and go with what's on https://github.com/g2p/util-linux/commits (the csum patches I sent + Rolf's patch + a patch that depends on both). >> Alternatively, do you see a way libblkid can return good magic / bad checksum >> results? > > If I good understand your patches then it makes wipefs(8) more > "hungry" to zap incomplete superblock. I have no problem to support > this scenario. The second patch does that, and the first one also prevents exposing nested data when a csum is broken, which was a dangerous failure mode. > Something else (like report bad checksums to udev) is probably > unnecessary. Right? It would be good to have, because silent boot failures suck. Maybe as a tweak to udev's embedded blkid? >>> I agree, f20 is a specific case, but in general probe-bcache will be >>> needed for a while. >> >> For the record, the libblkid patch is a good thing in the long run: >> common interface, less forks in udev. > > Yes, definitely. > > Maybe we can backport the patch to F20 if you need it -- it's not too > invasive change. (Letting Rolf field this one) ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <522DE939.5090009-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: bcache-tools package for Fedora / status probe-bcache [not found] ` <522DE939.5090009-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2013-09-11 11:59 ` Rolf Fokkens 2013-09-11 15:51 ` Karel Zak 1 sibling, 0 replies; 23+ messages in thread From: Rolf Fokkens @ 2013-09-11 11:59 UTC (permalink / raw) To: Gabriel de Perthuis, Karel Zak Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, util-linux Op 09-09-13 17:28 schreef Gabriel de Perthuis <g2p.code-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>: >> Maybe we can backport the patch to F20 if you need it -- it's not too >> invasive change. > >(Letting Rolf field this one) Most important for me is to have bcache identification by blkid in before F20, so the udev rules file doesn't have to call bcache-probe. Whether or not it uses checksums is not the most important thing, and that aspect might even change later. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: bcache-tools package for Fedora / status probe-bcache [not found] ` <522DE939.5090009-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 2013-09-11 11:59 ` Rolf Fokkens @ 2013-09-11 15:51 ` Karel Zak 1 sibling, 0 replies; 23+ messages in thread From: Karel Zak @ 2013-09-11 15:51 UTC (permalink / raw) To: Gabriel de Perthuis Cc: Rolf Fokkens, linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, util-linux On Mon, Sep 09, 2013 at 05:28:57PM +0200, Gabriel de Perthuis wrote: > It's correct insofar as current consumers expect it, and it's better > for error reporting. The patches took care of my other objections, > so you can keep the crc check and go with what's on > https://github.com/g2p/util-linux/commits > (the csum patches I sent + Rolf's patch + a patch that depends on both). Merged with some changes - not added blkid_probe_is_badcsum() the info about bad csum is exported by SBBADCSUM=1 variable, you have to use for example: if (blkid_probe_has_value(pr, "SBBADCSUM")).... - the usage type is BLKID_USAGE_OTHER rather than "raid" (we have some special exceptions and tests for raids that are unnecessary for bcache) I have also added the test images from Rolf to util-linux test suite. $ blkid -o udev -p tests/output/blkid/images-fs/bcache-C.img ID_FS_UUID=7a343627-ac87-4bf0-b76f-46067cbc9b8c ID_FS_UUID_ENC=7a343627-ac87-4bf0-b76f-46067cbc9b8c ID_FS_TYPE=bcache ID_FS_USAGE=other Thanks! Karel -- Karel Zak <kzak-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> http://karelzak.blogspot.com -- To unsubscribe from this list: send the line "unsubscribe util-linux" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 23+ messages in thread
* [RFC] bcache-status
@ 2013-08-15 23:35 Darrick J. Wong
[not found] ` <20130815233508.GB6949-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org>
0 siblings, 1 reply; 23+ messages in thread
From: Darrick J. Wong @ 2013-08-15 23:35 UTC (permalink / raw)
To: Kent Overstreet; +Cc: bcache
Hi all,
I wrote a script to dump out various stats about a bcache. It would be nice
eventually to put it into bcache-tools so that users don't have to go digging
through sysfs, but for now I'm really just wondering, does this program
interpret the sysfs files correctly?
I'm particularly anxious about 'cache used' since it's just reading out of
/sys/fs/bcache/*/cache*/priority_stats and multiplying by cache size...
...also I wonder what the negative dirty data count means?
$ bcache-status -s
--- bcache ---
Device /dev/bcache0 (253:0)
UUID c4157b48-5cdc-4554-8ce6-520dafdbac55
Block Size 4.00KiB
Bucket Size 512.00KiB
Congested? False
Read Congestion 2.0ms
Write Congestion 20.0ms
Total Cache Size 205.66GiB
Total Cache Used 26.74GiB (12%)
Total Cache Unused 178.92GiB (87%)
Dirty Data 0B (0%)
Evictable Cache 205.66GiB (100%)
Replacement Policy [lru] fifo random
Cache Mode writethrough [writeback] writearound none
Total Hits 263809 (56%)
Total Misses 199136
Total Bypass Hits 9079 (100%)
Total Bypass Misses 0
Total Bypassed 2.70GiB
--- Backing Device ---
Device /dev/sdb1 (8:17)
Size 698.64GiB
Cache Mode writethrough [writeback] writearound none
Readahead 0
Sequential Cutoff 4.00MiB
Merge sequential? True
State dirty
Writeback? True
Dirty Data -2.10MiB
Total Hits 263809 (56%)
Total Misses 199136
Total Bypass Hits 9079 (100%)
Total Bypass Misses 0
Total Bypassed 2.60GiB
--- Cache Device ---
Device /dev/sda4 (8:4)
Size 205.66GiB
Block Size 4.00KiB
Bucket Size 512.00KiB
Replacement Policy [lru] fifo random
Discard? False
I/O Errors 0
Metadata Written 1.10GiB
Data Written 25.30GiB
Buckets 421190
Cache Used 26.74GiB (12%)
Cache Unused 178.92GiB (87%)
--D
#!/usr/bin/env python3
# Dumb script to dump (some) of bcache status
# Copyright 2013 Darrick J. Wong. All rights reserved.
# This program is licensed under GPLv2.
import os
import sys
MAX_KEY_LENGTH = 28
def file_to_lines(fname):
try:
with open(fname, "r") as fd:
return fd.readlines()
except:
return []
def file_to_line(fname):
ret = file_to_lines(fname)
if len(ret) > 0:
return ret[0].strip()
return ''
def str_to_bool(x):
if x == '1':
return True
return False
def format_sectors(x):
'''Pretty print a sector count.'''
sectors = int(x)
asectors = abs(sectors)
if asectors == 0:
return '0B'
elif asectors < 2048:
return '%.2fKiB' % (sectors / 2)
elif asectors < 2097152:
return '%.2fMiB' % (sectors / 2048)
elif asectors < 2147483648:
return '%.2fGiB' % (sectors / 2097152)
else:
return '%.2fTiB' % (sectors / 2147483648)
def interpret_sectors(x):
'''Interpret a pretty-printed disk size.'''
factors = {
'k': 1 << 10,
'M': 1 << 20,
'G': 1 << 30,
'T': 1 << 40,
'P': 1 << 50,
'E': 1 << 60,
'Z': 1 << 70,
'Y': 1 << 80,
}
factor = 1
if x[-1] in factors:
factor = factors[x[-1]]
x = x[:-1]
return int(float(x) * factor / 512)
def pretty_size(x):
return format_sectors(interpret_sectors(x))
def dump_bdev(bdev_path):
'''Dump a backing device stats.'''
global MAX_KEY_LENGTH, devnum_map
attrs = [
('../dev', 'Device', lambda x: '%s (%s)' % (devnum_map.get(x, '?'), x)),
('../size', 'Size', format_sectors),
('cache_mode', 'Cache Mode', None),
('readahead', 'Readahead', None),
('sequential_cutoff', 'Sequential Cutoff', pretty_size),
('sequential_merge', 'Merge sequential?', str_to_bool),
('state', 'State', None),
('writeback_running', 'Writeback?', str_to_bool),
('dirty_data', 'Dirty Data', pretty_size),
]
print('--- Backing Device ---')
for (sysfs_name, display_name, conversion_func) in attrs:
val = file_to_line('%s/%s' % (bdev_path, sysfs_name))
if conversion_func is not None:
val = conversion_func(val)
if display_name is None:
display_name = sysfs_name
print(' %-*s%s' % (MAX_KEY_LENGTH - 2, display_name, val))
def dump_cachedev(cachedev_path):
'''Dump a cachding device stats.'''
def fmt_cachesize(val):
return '%s\t(%d%%)' % (format_sectors(val), float(val) / cache_size * 100)
global MAX_KEY_LENGTH, devnum_map
attrs = [
('../dev', 'Device', lambda x: '%s (%s)' % (devnum_map.get(x, '?'), x)),
('../size', 'Size', format_sectors),
('block_size', 'Block Size', pretty_size),
('bucket_size', 'Bucket Size', pretty_size),
('cache_replacement_policy', 'Replacement Policy', None),
('discard', 'Discard?', str_to_bool),
('io_errors', 'I/O Errors', None),
('metadata_written', 'Metadata Written', pretty_size),
('written', 'Data Written', pretty_size),
('nbuckets', 'Buckets', None),
(None, 'Cache Used', lambda x: fmt_cachesize(used_sectors)),
(None, 'Cache Unused', lambda x: fmt_cachesize(unused_sectors)),
]
stats = get_cache_priority_stats(cachedev_path)
cache_size = int(file_to_line('%s/../size' % cachedev_path))
unused_sectors = float(stats['Unused'][:-1]) * cache_size / 100
used_sectors = cache_size - unused_sectors
print('--- Cache Device ---')
for (sysfs_name, display_name, conversion_func) in attrs:
if sysfs_name is not None:
val = file_to_line('%s/%s' % (cachedev_path, sysfs_name))
if conversion_func is not None:
val = conversion_func(val)
if display_name is None:
display_name = sysfs_name
print(' %-*s%s' % (MAX_KEY_LENGTH - 2, display_name, val))
def hits_to_str(hits_str, misses_str):
'''Render a hits/misses ratio as a string.'''
hits = int(hits_str)
misses = int(misses_str)
ret = '%d' % hits
if hits + misses != 0:
ret = '%s\t(%.d%%)' % (ret, 100 * hits / (hits + misses))
return ret
def dump_stats(sysfs_path, indent_str, stats):
'''Dump stats on a bcache device.'''
stat_types = [
('five_minute', 'Last 5min'),
('hour', 'Last Hour'),
('day', 'Last Day'),
('total', 'Total'),
]
attrs = ['bypassed', 'cache_bypass_hits', 'cache_bypass_misses', 'cache_hits', 'cache_misses']
display = [
('Hits', lambda: hits_to_str(stat_data['cache_hits'], stat_data['cache_misses'])),
('Misses', lambda: stat_data['cache_misses']),
('Bypass Hits', lambda: hits_to_str(stat_data['cache_bypass_hits'], stat_data['cache_bypass_misses'])),
('Bypass Misses', lambda: stat_data['cache_bypass_misses']),
('Bypassed', lambda: pretty_size(stat_data['bypassed'])),
]
for (sysfs_name, stat_display_name) in stat_types:
if len(stats) > 0 and sysfs_name not in stats:
continue
stat_data = {}
for attr in attrs:
val = file_to_line('%s/stats_%s/%s' % (sysfs_path, sysfs_name, attr))
stat_data[attr] = val
for (display_name, str_func) in display:
d = '%s%s %s' % (indent_str, stat_display_name, display_name)
print('%-*s%s' % (MAX_KEY_LENGTH, d, str_func()))
def get_cache_priority_stats(cache):
'''Retrieve priority stats from a cache.'''
attrs = {}
for line in file_to_lines('%s/priority_stats' % cache):
x = line.split()
key = x[0]
value = x[1]
attrs[key[:-1]] = value
return attrs
def dump_bcache(bcache_sysfs_path, stats, print_subdevices, device):
'''Dump bcache stats'''
global devnum_map
def fmt_cachesize(val):
return '%s\t(%d%%)' % (format_sectors(val), 100.0 * val / cache_sectors)
attrs = [
(None, 'Device', lambda x: '%s (%s)' % (devnum_map.get(device, '?'), device)),
(None, 'UUID', lambda x: os.path.basename(bcache_sysfs_path)),
('block_size', 'Block Size', pretty_size),
('bucket_size', 'Bucket Size', pretty_size),
('congested', 'Congested?', str_to_bool),
('congested_read_threshold_us', 'Read Congestion', lambda x: '%.1fms' % (int(x) / 1000)),
('congested_write_threshold_us', 'Write Congestion', lambda x: '%.1fms' % (int(x) / 1000)),
(None, 'Total Cache Size', lambda x: format_sectors(cache_sectors)),
(None, 'Total Cache Used', lambda x: fmt_cachesize(cache_used_sectors)),
(None, 'Total Cache Unused', lambda x: fmt_cachesize(cache_unused_sectors)),
('dirty_data', 'Dirty Data', lambda x: fmt_cachesize(interpret_sectors(x))),
('cache_available_percent', 'Evictable Cache', lambda x: '%s\t(%s%%)' % (format_sectors(float(x) * cache_sectors / 100), x)),
(None, 'Replacement Policy', lambda x: replacement_policies.pop() if len(replacement_policies) == 1 else '(Unknown)'),
(None, 'Cache Mode', lambda x: cache_modes.pop() if len(cache_modes) == 1 else '(Unknown)'),
]
# Calculate aggregate data
cache_sectors = 0
cache_unused_sectors = 0
cache_modes = set()
replacement_policies = set()
for obj in os.listdir(bcache_sysfs_path):
if not os.path.isdir('%s/%s' % (bcache_sysfs_path, obj)):
continue
if obj.startswith('cache'):
cache_size = int(file_to_line('%s/%s/../size' % (bcache_sysfs_path, obj)))
cache_sectors += cache_size
cstats = get_cache_priority_stats('%s/%s' % (bcache_sysfs_path, obj))
unused_size = float(cstats['Unused'][:-1]) * cache_size / 100
cache_unused_sectors += unused_size
replacement_policies.add(file_to_line('%s/%s/cache_replacement_policy' % (bcache_sysfs_path, obj)))
elif obj.startswith('bdev'):
cache_modes.add(file_to_line('%s/%s/cache_mode' % (bcache_sysfs_path, obj)))
cache_used_sectors = cache_sectors - cache_unused_sectors
# Dump basic stats
print("--- bcache ---")
for (sysfs_name, display_name, conversion_func) in attrs:
if sysfs_name is not None:
val = file_to_line('%s/%s' % (bcache_sysfs_path, sysfs_name))
else:
val = None
if conversion_func is not None:
val = conversion_func(val)
if display_name is None:
display_name = sysfs_name
print('%-*s%s' % (MAX_KEY_LENGTH, display_name, val))
dump_stats(bcache_sysfs_path, '', stats)
# Dump sub-device stats
if not print_subdevices:
return
for obj in os.listdir(bcache_sysfs_path):
if not os.path.isdir('%s/%s' % (bcache_sysfs_path, obj)):
continue
if obj.startswith('bdev'):
dump_bdev('%s/%s' % (bcache_sysfs_path, obj))
dump_stats('%s/%s' % (bcache_sysfs_path, obj), ' ', stats)
elif obj.startswith('cache'):
dump_cachedev('%s/%s' % (bcache_sysfs_path, obj))
def map_uuid_to_device():
'''Map bcache UUIDs to device files.'''
global SYSFS_BLOCK_PATH
ret = {}
for bdev in os.listdir(SYSFS_BLOCK_PATH):
link = '%s%s/bcache/cache' % (SYSFS_BLOCK_PATH, bdev)
if not os.path.islink(link):
continue
basename = os.path.basename(os.readlink(link))
ret[basename] = file_to_line('%s%s/dev' % (SYSFS_BLOCK_PATH, bdev))
return ret
def map_devnum_to_device():
'''Map device numbers to device files.'''
global DEV_BLOCK_PATH
ret = {}
for bdev in os.listdir(DEV_BLOCK_PATH):
ret[bdev] = os.path.realpath('%s%s' % (DEV_BLOCK_PATH, bdev))
return ret
def print_help():
print('Usage: %s [OPTIONS]' % sys.argv[0])
print('Options:')
print(' -f Print the last five minutes of stats.')
print(' -d Print the last hour of stats.')
print(' -h Print the last day of stats.')
print(' -t Print total stats.')
print(' -a Print all stats.')
print(' -r Reset stats after printing them.')
print(' -s Print subdevice status.')
print(' -g Invoke GC before printing status.')
print('By default, print only the total stats.')
def main():
'''Main function'''
global SYSFS_BCACHE_PATH
global uuid_map, devnum_map
stats = set()
reset_stats = False
print_subdevices = False
run_gc = False
for arg in sys.argv[1:]:
if arg == '--help':
print_help()
return 0
elif arg == '-f':
stats.add('five_minute')
elif arg == '-h':
stats.add('hour')
elif arg == '-d':
stats.add('day')
elif arg == '-t':
stats.add('total')
elif arg == '-a':
stats.add('five_minute')
stats.add('hour')
stats.add('day')
stats.add('total')
elif arg == '-r':
reset_stats = True
elif arg == '-s':
print_subdevices = True
elif arg == '-g':
run_gc = True
else:
print_help()
return 0
if len(stats) == 0:
stats.add('total')
uuid_map = map_uuid_to_device()
devnum_map = map_devnum_to_device()
for cache in os.listdir(SYSFS_BCACHE_PATH):
if not os.path.isdir('%s%s' % (SYSFS_BCACHE_PATH, cache)):
continue
if run_gc:
with open('%s%s/internal/trigger_gc' % (SYSFS_BCACHE_PATH, cache), 'w') as fd:
fd.write('1\n')
dump_bcache('%s%s' % (SYSFS_BCACHE_PATH, cache), stats, print_subdevices, uuid_map.get(cache, '?'))
if reset_stats:
with open('%s%s/clear_stats' % (SYSFS_BCACHE_PATH, cache), 'w') as fd:
fd.write('1\n')
SYSFS_BCACHE_PATH = '/sys/fs/bcache/'
SYSFS_BLOCK_PATH = '/sys/block/'
DEV_BLOCK_PATH = '/dev/block/'
if __name__ == '__main__':
main()
^ permalink raw reply [flat|nested] 23+ messages in thread[parent not found: <20130815233508.GB6949-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org>]
* Re: [RFC] bcache-status [not found] ` <20130815233508.GB6949-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org> @ 2013-08-16 5:09 ` Andrew Thrift [not found] ` <520DB3EC.70001-3e6jenk95VYpDvLZ8AWkcaVXKuFTiq87@public.gmane.org> 2013-08-19 11:48 ` Damien Churchill 1 sibling, 1 reply; 23+ messages in thread From: Andrew Thrift @ 2013-08-16 5:09 UTC (permalink / raw) To: Darrick J. Wong, linux-bcache-u79uwXL29TY76Z2rM5mHXA On 8/16/2013 11:35 AM, Darrick J. Wong wrote: > Hi all, > > I wrote a script to dump out various stats about a bcache. It would be nice > eventually to put it into bcache-tools so that users don't have to go digging > through sysfs, but for now I'm really just wondering, does this program > interpret the sysfs files correctly? > > I'm particularly anxious about 'cache used' since it's just reading out of > /sys/fs/bcache/*/cache*/priority_stats and multiplying by cache size... > > ...also I wonder what the negative dirty data count means? > > $ bcache-status -s > --- bcache --- > Device /dev/bcache0 (253:0) > UUID c4157b48-5cdc-4554-8ce6-520dafdbac55 > Block Size 4.00KiB > Bucket Size 512.00KiB > Congested? False > Read Congestion 2.0ms > Write Congestion 20.0ms > Total Cache Size 205.66GiB > Total Cache Used 26.74GiB (12%) > Total Cache Unused 178.92GiB (87%) > Dirty Data 0B (0%) > Evictable Cache 205.66GiB (100%) > Replacement Policy [lru] fifo random > Cache Mode writethrough [writeback] writearound none > Total Hits 263809 (56%) > Total Misses 199136 > Total Bypass Hits 9079 (100%) > Total Bypass Misses 0 > Total Bypassed 2.70GiB > --- Backing Device --- > Device /dev/sdb1 (8:17) > Size 698.64GiB > Cache Mode writethrough [writeback] writearound none > Readahead 0 > Sequential Cutoff 4.00MiB > Merge sequential? True > State dirty > Writeback? True > Dirty Data -2.10MiB > Total Hits 263809 (56%) > Total Misses 199136 > Total Bypass Hits 9079 (100%) > Total Bypass Misses 0 > Total Bypassed 2.60GiB > --- Cache Device --- > Device /dev/sda4 (8:4) > Size 205.66GiB > Block Size 4.00KiB > Bucket Size 512.00KiB > Replacement Policy [lru] fifo random > Discard? False > I/O Errors 0 > Metadata Written 1.10GiB > Data Written 25.30GiB > Buckets 421190 > Cache Used 26.74GiB (12%) > Cache Unused 178.92GiB (87%) > > --D > > #!/usr/bin/env python3 > # Dumb script to dump (some) of bcache status > # Copyright 2013 Darrick J. Wong. All rights reserved. > # This program is licensed under GPLv2. > > import os > import sys > > MAX_KEY_LENGTH = 28 > > def file_to_lines(fname): > try: > with open(fname, "r") as fd: > return fd.readlines() > except: > return [] > > def file_to_line(fname): > ret = file_to_lines(fname) > if len(ret) > 0: > return ret[0].strip() > return '' > > def str_to_bool(x): > if x == '1': > return True > return False > > def format_sectors(x): > '''Pretty print a sector count.''' > sectors = int(x) > asectors = abs(sectors) > > if asectors == 0: > return '0B' > elif asectors < 2048: > return '%.2fKiB' % (sectors / 2) > elif asectors < 2097152: > return '%.2fMiB' % (sectors / 2048) > elif asectors < 2147483648: > return '%.2fGiB' % (sectors / 2097152) > else: > return '%.2fTiB' % (sectors / 2147483648) > > def interpret_sectors(x): > '''Interpret a pretty-printed disk size.''' > factors = { > 'k': 1 << 10, > 'M': 1 << 20, > 'G': 1 << 30, > 'T': 1 << 40, > 'P': 1 << 50, > 'E': 1 << 60, > 'Z': 1 << 70, > 'Y': 1 << 80, > } > > factor = 1 > if x[-1] in factors: > factor = factors[x[-1]] > x = x[:-1] > return int(float(x) * factor / 512) > > def pretty_size(x): > return format_sectors(interpret_sectors(x)) > > def dump_bdev(bdev_path): > '''Dump a backing device stats.''' > global MAX_KEY_LENGTH, devnum_map > attrs = [ > ('../dev', 'Device', lambda x: '%s (%s)' % (devnum_map.get(x, '?'), x)), > ('../size', 'Size', format_sectors), > ('cache_mode', 'Cache Mode', None), > ('readahead', 'Readahead', None), > ('sequential_cutoff', 'Sequential Cutoff', pretty_size), > ('sequential_merge', 'Merge sequential?', str_to_bool), > ('state', 'State', None), > ('writeback_running', 'Writeback?', str_to_bool), > ('dirty_data', 'Dirty Data', pretty_size), > ] > > print('--- Backing Device ---') > for (sysfs_name, display_name, conversion_func) in attrs: > val = file_to_line('%s/%s' % (bdev_path, sysfs_name)) > if conversion_func is not None: > val = conversion_func(val) > if display_name is None: > display_name = sysfs_name > print(' %-*s%s' % (MAX_KEY_LENGTH - 2, display_name, val)) > > def dump_cachedev(cachedev_path): > '''Dump a cachding device stats.''' > def fmt_cachesize(val): > return '%s\t(%d%%)' % (format_sectors(val), float(val) / cache_size * 100) > > global MAX_KEY_LENGTH, devnum_map > attrs = [ > ('../dev', 'Device', lambda x: '%s (%s)' % (devnum_map.get(x, '?'), x)), > ('../size', 'Size', format_sectors), > ('block_size', 'Block Size', pretty_size), > ('bucket_size', 'Bucket Size', pretty_size), > ('cache_replacement_policy', 'Replacement Policy', None), > ('discard', 'Discard?', str_to_bool), > ('io_errors', 'I/O Errors', None), > ('metadata_written', 'Metadata Written', pretty_size), > ('written', 'Data Written', pretty_size), > ('nbuckets', 'Buckets', None), > (None, 'Cache Used', lambda x: fmt_cachesize(used_sectors)), > (None, 'Cache Unused', lambda x: fmt_cachesize(unused_sectors)), > ] > > stats = get_cache_priority_stats(cachedev_path) > cache_size = int(file_to_line('%s/../size' % cachedev_path)) > unused_sectors = float(stats['Unused'][:-1]) * cache_size / 100 > used_sectors = cache_size - unused_sectors > > print('--- Cache Device ---') > for (sysfs_name, display_name, conversion_func) in attrs: > if sysfs_name is not None: > val = file_to_line('%s/%s' % (cachedev_path, sysfs_name)) > if conversion_func is not None: > val = conversion_func(val) > if display_name is None: > display_name = sysfs_name > print(' %-*s%s' % (MAX_KEY_LENGTH - 2, display_name, val)) > > def hits_to_str(hits_str, misses_str): > '''Render a hits/misses ratio as a string.''' > hits = int(hits_str) > misses = int(misses_str) > > ret = '%d' % hits > if hits + misses != 0: > ret = '%s\t(%.d%%)' % (ret, 100 * hits / (hits + misses)) > return ret > > def dump_stats(sysfs_path, indent_str, stats): > '''Dump stats on a bcache device.''' > stat_types = [ > ('five_minute', 'Last 5min'), > ('hour', 'Last Hour'), > ('day', 'Last Day'), > ('total', 'Total'), > ] > attrs = ['bypassed', 'cache_bypass_hits', 'cache_bypass_misses', 'cache_hits', 'cache_misses'] > display = [ > ('Hits', lambda: hits_to_str(stat_data['cache_hits'], stat_data['cache_misses'])), > ('Misses', lambda: stat_data['cache_misses']), > ('Bypass Hits', lambda: hits_to_str(stat_data['cache_bypass_hits'], stat_data['cache_bypass_misses'])), > ('Bypass Misses', lambda: stat_data['cache_bypass_misses']), > ('Bypassed', lambda: pretty_size(stat_data['bypassed'])), > ] > > for (sysfs_name, stat_display_name) in stat_types: > if len(stats) > 0 and sysfs_name not in stats: > continue > stat_data = {} > for attr in attrs: > val = file_to_line('%s/stats_%s/%s' % (sysfs_path, sysfs_name, attr)) > stat_data[attr] = val > for (display_name, str_func) in display: > d = '%s%s %s' % (indent_str, stat_display_name, display_name) > print('%-*s%s' % (MAX_KEY_LENGTH, d, str_func())) > > def get_cache_priority_stats(cache): > '''Retrieve priority stats from a cache.''' > attrs = {} > > for line in file_to_lines('%s/priority_stats' % cache): > x = line.split() > key = x[0] > value = x[1] > attrs[key[:-1]] = value > return attrs > > def dump_bcache(bcache_sysfs_path, stats, print_subdevices, device): > '''Dump bcache stats''' > global devnum_map > def fmt_cachesize(val): > return '%s\t(%d%%)' % (format_sectors(val), 100.0 * val / cache_sectors) > > attrs = [ > (None, 'Device', lambda x: '%s (%s)' % (devnum_map.get(device, '?'), device)), > (None, 'UUID', lambda x: os.path.basename(bcache_sysfs_path)), > ('block_size', 'Block Size', pretty_size), > ('bucket_size', 'Bucket Size', pretty_size), > ('congested', 'Congested?', str_to_bool), > ('congested_read_threshold_us', 'Read Congestion', lambda x: '%.1fms' % (int(x) / 1000)), > ('congested_write_threshold_us', 'Write Congestion', lambda x: '%.1fms' % (int(x) / 1000)), > (None, 'Total Cache Size', lambda x: format_sectors(cache_sectors)), > (None, 'Total Cache Used', lambda x: fmt_cachesize(cache_used_sectors)), > (None, 'Total Cache Unused', lambda x: fmt_cachesize(cache_unused_sectors)), > ('dirty_data', 'Dirty Data', lambda x: fmt_cachesize(interpret_sectors(x))), > ('cache_available_percent', 'Evictable Cache', lambda x: '%s\t(%s%%)' % (format_sectors(float(x) * cache_sectors / 100), x)), > (None, 'Replacement Policy', lambda x: replacement_policies.pop() if len(replacement_policies) == 1 else '(Unknown)'), > (None, 'Cache Mode', lambda x: cache_modes.pop() if len(cache_modes) == 1 else '(Unknown)'), > ] > > # Calculate aggregate data > cache_sectors = 0 > cache_unused_sectors = 0 > cache_modes = set() > replacement_policies = set() > for obj in os.listdir(bcache_sysfs_path): > if not os.path.isdir('%s/%s' % (bcache_sysfs_path, obj)): > continue > if obj.startswith('cache'): > cache_size = int(file_to_line('%s/%s/../size' % (bcache_sysfs_path, obj))) > cache_sectors += cache_size > cstats = get_cache_priority_stats('%s/%s' % (bcache_sysfs_path, obj)) > unused_size = float(cstats['Unused'][:-1]) * cache_size / 100 > cache_unused_sectors += unused_size > replacement_policies.add(file_to_line('%s/%s/cache_replacement_policy' % (bcache_sysfs_path, obj))) > elif obj.startswith('bdev'): > cache_modes.add(file_to_line('%s/%s/cache_mode' % (bcache_sysfs_path, obj))) > cache_used_sectors = cache_sectors - cache_unused_sectors > > # Dump basic stats > print("--- bcache ---") > for (sysfs_name, display_name, conversion_func) in attrs: > if sysfs_name is not None: > val = file_to_line('%s/%s' % (bcache_sysfs_path, sysfs_name)) > else: > val = None > if conversion_func is not None: > val = conversion_func(val) > if display_name is None: > display_name = sysfs_name > print('%-*s%s' % (MAX_KEY_LENGTH, display_name, val)) > dump_stats(bcache_sysfs_path, '', stats) > > # Dump sub-device stats > if not print_subdevices: > return > for obj in os.listdir(bcache_sysfs_path): > if not os.path.isdir('%s/%s' % (bcache_sysfs_path, obj)): > continue > if obj.startswith('bdev'): > dump_bdev('%s/%s' % (bcache_sysfs_path, obj)) > dump_stats('%s/%s' % (bcache_sysfs_path, obj), ' ', stats) > elif obj.startswith('cache'): > dump_cachedev('%s/%s' % (bcache_sysfs_path, obj)) > > def map_uuid_to_device(): > '''Map bcache UUIDs to device files.''' > global SYSFS_BLOCK_PATH > ret = {} > > for bdev in os.listdir(SYSFS_BLOCK_PATH): > link = '%s%s/bcache/cache' % (SYSFS_BLOCK_PATH, bdev) > if not os.path.islink(link): > continue > basename = os.path.basename(os.readlink(link)) > ret[basename] = file_to_line('%s%s/dev' % (SYSFS_BLOCK_PATH, bdev)) > return ret > > def map_devnum_to_device(): > '''Map device numbers to device files.''' > global DEV_BLOCK_PATH > ret = {} > > for bdev in os.listdir(DEV_BLOCK_PATH): > ret[bdev] = os.path.realpath('%s%s' % (DEV_BLOCK_PATH, bdev)) > > return ret > > def print_help(): > print('Usage: %s [OPTIONS]' % sys.argv[0]) > print('Options:') > print(' -f Print the last five minutes of stats.') > print(' -d Print the last hour of stats.') > print(' -h Print the last day of stats.') > print(' -t Print total stats.') > print(' -a Print all stats.') > print(' -r Reset stats after printing them.') > print(' -s Print subdevice status.') > print(' -g Invoke GC before printing status.') > print('By default, print only the total stats.') > > def main(): > '''Main function''' > global SYSFS_BCACHE_PATH > global uuid_map, devnum_map > stats = set() > reset_stats = False > print_subdevices = False > run_gc = False > > for arg in sys.argv[1:]: > if arg == '--help': > print_help() > return 0 > elif arg == '-f': > stats.add('five_minute') > elif arg == '-h': > stats.add('hour') > elif arg == '-d': > stats.add('day') > elif arg == '-t': > stats.add('total') > elif arg == '-a': > stats.add('five_minute') > stats.add('hour') > stats.add('day') > stats.add('total') > elif arg == '-r': > reset_stats = True > elif arg == '-s': > print_subdevices = True > elif arg == '-g': > run_gc = True > else: > print_help() > return 0 > if len(stats) == 0: > stats.add('total') > > uuid_map = map_uuid_to_device() > devnum_map = map_devnum_to_device() > for cache in os.listdir(SYSFS_BCACHE_PATH): > if not os.path.isdir('%s%s' % (SYSFS_BCACHE_PATH, cache)): > continue > > if run_gc: > with open('%s%s/internal/trigger_gc' % (SYSFS_BCACHE_PATH, cache), 'w') as fd: > fd.write('1\n') > > dump_bcache('%s%s' % (SYSFS_BCACHE_PATH, cache), stats, print_subdevices, uuid_map.get(cache, '?')) > > if reset_stats: > with open('%s%s/clear_stats' % (SYSFS_BCACHE_PATH, cache), 'w') as fd: > fd.write('1\n') > > SYSFS_BCACHE_PATH = '/sys/fs/bcache/' > SYSFS_BLOCK_PATH = '/sys/block/' > DEV_BLOCK_PATH = '/dev/block/' > if __name__ == '__main__': > main() > > -- > To unsubscribe from this list: send the line "unsubscribe linux-bcache" in > the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Hi Darrick, A very useful script indeed. We made the following changes: - Removed "Device" from under cache-set header - Added "bcache Device" to Backing Device section - Changed "Device" to "Physical Device" in Backing Device section - Removed "Cache Mode" from cache-set header as it set per backing device We will make some more changes in the coming weeks to implement a brief display mode as well as a verbose display mode. Patch inline: --- /usr/local/bin/bcache-status 2013-08-16 11:51:55.281095640 +1200 +++ bcache-status 2013-08-16 17:00:28.884020997 +1200 @@ -64,11 +64,16 @@ def pretty_size(x): return format_sectors(interpret_sectors(x)) +def device_path(x): + x="/dev/block/%s" % x + return os.path.abspath(os.path.join(os.path.dirname(x), os.readlink(x))) + def dump_bdev(bdev_path): '''Dump a backing device stats.''' global MAX_KEY_LENGTH, devnum_map attrs = [ - ('../dev', 'Device', lambda x: '%s (%s)' % (devnum_map.get(x, '?'), x)), + ('dev/dev', 'bcache Device', device_path), + ('../dev', 'Physical Device', lambda x: '%s (%s)' % (devnum_map.get(x, '?'), x)), ('../size', 'Size', format_sectors), ('cache_mode', 'Cache Mode', None), ('readahead', 'Readahead', None), @@ -180,7 +185,7 @@ return '%s\t(%d%%)' % (format_sectors(val), 100.0 * val / cache_sectors) attrs = [ - (None, 'Device', lambda x: '%s (%s)' % (devnum_map.get(device, '?'), device)), + #(None, 'Device', lambda x: '%s (%s)' % (devnum_map.get(device, '?'), device)), (None, 'UUID', lambda x: os.path.basename(bcache_sysfs_path)), ('block_size', 'Block Size', pretty_size), ('bucket_size', 'Bucket Size', pretty_size), @@ -268,8 +273,8 @@ print('Usage: %s [OPTIONS]' % sys.argv[0]) print('Options:') print(' -f Print the last five minutes of stats.') - print(' -d Print the last hour of stats.') - print(' -h Print the last day of stats.') + print(' -h Print the last hour of stats.') + print(' -d Print the last day of stats.') print(' -t Print total stats.') print(' -a Print all stats.') print(' -r Reset stats after printing them.') Regards, Andrew ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <520DB3EC.70001-3e6jenk95VYpDvLZ8AWkcaVXKuFTiq87@public.gmane.org>]
* Re: [RFC] bcache-status [not found] ` <520DB3EC.70001-3e6jenk95VYpDvLZ8AWkcaVXKuFTiq87@public.gmane.org> @ 2013-08-16 21:35 ` Darrick J. Wong 0 siblings, 0 replies; 23+ messages in thread From: Darrick J. Wong @ 2013-08-16 21:35 UTC (permalink / raw) To: Andrew Thrift; +Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA On Fri, Aug 16, 2013 at 05:09:00PM +1200, Andrew Thrift wrote: > On 8/16/2013 11:35 AM, Darrick J. Wong wrote: > >Hi all, > > > >I wrote a script to dump out various stats about a bcache. It would be nice > >eventually to put it into bcache-tools so that users don't have to go digging > >through sysfs, but for now I'm really just wondering, does this program > >interpret the sysfs files correctly? > > > >I'm particularly anxious about 'cache used' since it's just reading out of > >/sys/fs/bcache/*/cache*/priority_stats and multiplying by cache size... > > > >...also I wonder what the negative dirty data count means? > > > >$ bcache-status -s > >--- bcache --- > >Device /dev/bcache0 (253:0) > >UUID c4157b48-5cdc-4554-8ce6-520dafdbac55 > >Block Size 4.00KiB > >Bucket Size 512.00KiB > >Congested? False > >Read Congestion 2.0ms > >Write Congestion 20.0ms > >Total Cache Size 205.66GiB > >Total Cache Used 26.74GiB (12%) > >Total Cache Unused 178.92GiB (87%) > >Dirty Data 0B (0%) > >Evictable Cache 205.66GiB (100%) > >Replacement Policy [lru] fifo random > >Cache Mode writethrough [writeback] writearound none > >Total Hits 263809 (56%) > >Total Misses 199136 > >Total Bypass Hits 9079 (100%) > >Total Bypass Misses 0 > >Total Bypassed 2.70GiB > >--- Backing Device --- > > Device /dev/sdb1 (8:17) > > Size 698.64GiB > > Cache Mode writethrough [writeback] writearound none > > Readahead 0 > > Sequential Cutoff 4.00MiB > > Merge sequential? True > > State dirty > > Writeback? True > > Dirty Data -2.10MiB > > Total Hits 263809 (56%) > > Total Misses 199136 > > Total Bypass Hits 9079 (100%) > > Total Bypass Misses 0 > > Total Bypassed 2.60GiB > >--- Cache Device --- > > Device /dev/sda4 (8:4) > > Size 205.66GiB > > Block Size 4.00KiB > > Bucket Size 512.00KiB > > Replacement Policy [lru] fifo random > > Discard? False > > I/O Errors 0 > > Metadata Written 1.10GiB > > Data Written 25.30GiB > > Buckets 421190 > > Cache Used 26.74GiB (12%) > > Cache Unused 178.92GiB (87%) > > > >--D > > > >#!/usr/bin/env python3 > ># Dumb script to dump (some) of bcache status > ># Copyright 2013 Darrick J. Wong. All rights reserved. > ># This program is licensed under GPLv2. > > > >import os > >import sys > > > >MAX_KEY_LENGTH = 28 > > > >def file_to_lines(fname): > > try: > > with open(fname, "r") as fd: > > return fd.readlines() > > except: > > return [] > > > >def file_to_line(fname): > > ret = file_to_lines(fname) > > if len(ret) > 0: > > return ret[0].strip() > > return '' > > > >def str_to_bool(x): > > if x == '1': > > return True > > return False > > > >def format_sectors(x): > > '''Pretty print a sector count.''' > > sectors = int(x) > > asectors = abs(sectors) > > > > if asectors == 0: > > return '0B' > > elif asectors < 2048: > > return '%.2fKiB' % (sectors / 2) > > elif asectors < 2097152: > > return '%.2fMiB' % (sectors / 2048) > > elif asectors < 2147483648: > > return '%.2fGiB' % (sectors / 2097152) > > else: > > return '%.2fTiB' % (sectors / 2147483648) > > > >def interpret_sectors(x): > > '''Interpret a pretty-printed disk size.''' > > factors = { > > 'k': 1 << 10, > > 'M': 1 << 20, > > 'G': 1 << 30, > > 'T': 1 << 40, > > 'P': 1 << 50, > > 'E': 1 << 60, > > 'Z': 1 << 70, > > 'Y': 1 << 80, > > } > > > > factor = 1 > > if x[-1] in factors: > > factor = factors[x[-1]] > > x = x[:-1] > > return int(float(x) * factor / 512) > > > >def pretty_size(x): > > return format_sectors(interpret_sectors(x)) > > > >def dump_bdev(bdev_path): > > '''Dump a backing device stats.''' > > global MAX_KEY_LENGTH, devnum_map > > attrs = [ > > ('../dev', 'Device', lambda x: '%s (%s)' % (devnum_map.get(x, '?'), x)), > > ('../size', 'Size', format_sectors), > > ('cache_mode', 'Cache Mode', None), > > ('readahead', 'Readahead', None), > > ('sequential_cutoff', 'Sequential Cutoff', pretty_size), > > ('sequential_merge', 'Merge sequential?', str_to_bool), > > ('state', 'State', None), > > ('writeback_running', 'Writeback?', str_to_bool), > > ('dirty_data', 'Dirty Data', pretty_size), > > ] > > > > print('--- Backing Device ---') > > for (sysfs_name, display_name, conversion_func) in attrs: > > val = file_to_line('%s/%s' % (bdev_path, sysfs_name)) > > if conversion_func is not None: > > val = conversion_func(val) > > if display_name is None: > > display_name = sysfs_name > > print(' %-*s%s' % (MAX_KEY_LENGTH - 2, display_name, val)) > > > >def dump_cachedev(cachedev_path): > > '''Dump a cachding device stats.''' > > def fmt_cachesize(val): > > return '%s\t(%d%%)' % (format_sectors(val), float(val) / cache_size * 100) > > > > global MAX_KEY_LENGTH, devnum_map > > attrs = [ > > ('../dev', 'Device', lambda x: '%s (%s)' % (devnum_map.get(x, '?'), x)), > > ('../size', 'Size', format_sectors), > > ('block_size', 'Block Size', pretty_size), > > ('bucket_size', 'Bucket Size', pretty_size), > > ('cache_replacement_policy', 'Replacement Policy', None), > > ('discard', 'Discard?', str_to_bool), > > ('io_errors', 'I/O Errors', None), > > ('metadata_written', 'Metadata Written', pretty_size), > > ('written', 'Data Written', pretty_size), > > ('nbuckets', 'Buckets', None), > > (None, 'Cache Used', lambda x: fmt_cachesize(used_sectors)), > > (None, 'Cache Unused', lambda x: fmt_cachesize(unused_sectors)), > > ] > > > > stats = get_cache_priority_stats(cachedev_path) > > cache_size = int(file_to_line('%s/../size' % cachedev_path)) > > unused_sectors = float(stats['Unused'][:-1]) * cache_size / 100 > > used_sectors = cache_size - unused_sectors > > > > print('--- Cache Device ---') > > for (sysfs_name, display_name, conversion_func) in attrs: > > if sysfs_name is not None: > > val = file_to_line('%s/%s' % (cachedev_path, sysfs_name)) > > if conversion_func is not None: > > val = conversion_func(val) > > if display_name is None: > > display_name = sysfs_name > > print(' %-*s%s' % (MAX_KEY_LENGTH - 2, display_name, val)) > > > >def hits_to_str(hits_str, misses_str): > > '''Render a hits/misses ratio as a string.''' > > hits = int(hits_str) > > misses = int(misses_str) > > > > ret = '%d' % hits > > if hits + misses != 0: > > ret = '%s\t(%.d%%)' % (ret, 100 * hits / (hits + misses)) > > return ret > > > >def dump_stats(sysfs_path, indent_str, stats): > > '''Dump stats on a bcache device.''' > > stat_types = [ > > ('five_minute', 'Last 5min'), > > ('hour', 'Last Hour'), > > ('day', 'Last Day'), > > ('total', 'Total'), > > ] > > attrs = ['bypassed', 'cache_bypass_hits', 'cache_bypass_misses', 'cache_hits', 'cache_misses'] > > display = [ > > ('Hits', lambda: hits_to_str(stat_data['cache_hits'], stat_data['cache_misses'])), > > ('Misses', lambda: stat_data['cache_misses']), > > ('Bypass Hits', lambda: hits_to_str(stat_data['cache_bypass_hits'], stat_data['cache_bypass_misses'])), > > ('Bypass Misses', lambda: stat_data['cache_bypass_misses']), > > ('Bypassed', lambda: pretty_size(stat_data['bypassed'])), > > ] > > > > for (sysfs_name, stat_display_name) in stat_types: > > if len(stats) > 0 and sysfs_name not in stats: > > continue > > stat_data = {} > > for attr in attrs: > > val = file_to_line('%s/stats_%s/%s' % (sysfs_path, sysfs_name, attr)) > > stat_data[attr] = val > > for (display_name, str_func) in display: > > d = '%s%s %s' % (indent_str, stat_display_name, display_name) > > print('%-*s%s' % (MAX_KEY_LENGTH, d, str_func())) > > > >def get_cache_priority_stats(cache): > > '''Retrieve priority stats from a cache.''' > > attrs = {} > > > > for line in file_to_lines('%s/priority_stats' % cache): > > x = line.split() > > key = x[0] > > value = x[1] > > attrs[key[:-1]] = value > > return attrs > > > >def dump_bcache(bcache_sysfs_path, stats, print_subdevices, device): > > '''Dump bcache stats''' > > global devnum_map > > def fmt_cachesize(val): > > return '%s\t(%d%%)' % (format_sectors(val), 100.0 * val / cache_sectors) > > > > attrs = [ > > (None, 'Device', lambda x: '%s (%s)' % (devnum_map.get(device, '?'), device)), > > (None, 'UUID', lambda x: os.path.basename(bcache_sysfs_path)), > > ('block_size', 'Block Size', pretty_size), > > ('bucket_size', 'Bucket Size', pretty_size), > > ('congested', 'Congested?', str_to_bool), > > ('congested_read_threshold_us', 'Read Congestion', lambda x: '%.1fms' % (int(x) / 1000)), > > ('congested_write_threshold_us', 'Write Congestion', lambda x: '%.1fms' % (int(x) / 1000)), > > (None, 'Total Cache Size', lambda x: format_sectors(cache_sectors)), > > (None, 'Total Cache Used', lambda x: fmt_cachesize(cache_used_sectors)), > > (None, 'Total Cache Unused', lambda x: fmt_cachesize(cache_unused_sectors)), > > ('dirty_data', 'Dirty Data', lambda x: fmt_cachesize(interpret_sectors(x))), > > ('cache_available_percent', 'Evictable Cache', lambda x: '%s\t(%s%%)' % (format_sectors(float(x) * cache_sectors / 100), x)), > > (None, 'Replacement Policy', lambda x: replacement_policies.pop() if len(replacement_policies) == 1 else '(Unknown)'), > > (None, 'Cache Mode', lambda x: cache_modes.pop() if len(cache_modes) == 1 else '(Unknown)'), > > ] > > > > # Calculate aggregate data > > cache_sectors = 0 > > cache_unused_sectors = 0 > > cache_modes = set() > > replacement_policies = set() > > for obj in os.listdir(bcache_sysfs_path): > > if not os.path.isdir('%s/%s' % (bcache_sysfs_path, obj)): > > continue > > if obj.startswith('cache'): > > cache_size = int(file_to_line('%s/%s/../size' % (bcache_sysfs_path, obj))) > > cache_sectors += cache_size > > cstats = get_cache_priority_stats('%s/%s' % (bcache_sysfs_path, obj)) > > unused_size = float(cstats['Unused'][:-1]) * cache_size / 100 > > cache_unused_sectors += unused_size > > replacement_policies.add(file_to_line('%s/%s/cache_replacement_policy' % (bcache_sysfs_path, obj))) > > elif obj.startswith('bdev'): > > cache_modes.add(file_to_line('%s/%s/cache_mode' % (bcache_sysfs_path, obj))) > > cache_used_sectors = cache_sectors - cache_unused_sectors > > > > # Dump basic stats > > print("--- bcache ---") > > for (sysfs_name, display_name, conversion_func) in attrs: > > if sysfs_name is not None: > > val = file_to_line('%s/%s' % (bcache_sysfs_path, sysfs_name)) > > else: > > val = None > > if conversion_func is not None: > > val = conversion_func(val) > > if display_name is None: > > display_name = sysfs_name > > print('%-*s%s' % (MAX_KEY_LENGTH, display_name, val)) > > dump_stats(bcache_sysfs_path, '', stats) > > > > # Dump sub-device stats > > if not print_subdevices: > > return > > for obj in os.listdir(bcache_sysfs_path): > > if not os.path.isdir('%s/%s' % (bcache_sysfs_path, obj)): > > continue > > if obj.startswith('bdev'): > > dump_bdev('%s/%s' % (bcache_sysfs_path, obj)) > > dump_stats('%s/%s' % (bcache_sysfs_path, obj), ' ', stats) > > elif obj.startswith('cache'): > > dump_cachedev('%s/%s' % (bcache_sysfs_path, obj)) > > > >def map_uuid_to_device(): > > '''Map bcache UUIDs to device files.''' > > global SYSFS_BLOCK_PATH > > ret = {} > > > > for bdev in os.listdir(SYSFS_BLOCK_PATH): > > link = '%s%s/bcache/cache' % (SYSFS_BLOCK_PATH, bdev) > > if not os.path.islink(link): > > continue > > basename = os.path.basename(os.readlink(link)) > > ret[basename] = file_to_line('%s%s/dev' % (SYSFS_BLOCK_PATH, bdev)) > > return ret > > > >def map_devnum_to_device(): > > '''Map device numbers to device files.''' > > global DEV_BLOCK_PATH > > ret = {} > > > > for bdev in os.listdir(DEV_BLOCK_PATH): > > ret[bdev] = os.path.realpath('%s%s' % (DEV_BLOCK_PATH, bdev)) > > > > return ret > > > >def print_help(): > > print('Usage: %s [OPTIONS]' % sys.argv[0]) > > print('Options:') > > print(' -f Print the last five minutes of stats.') > > print(' -d Print the last hour of stats.') > > print(' -h Print the last day of stats.') > > print(' -t Print total stats.') > > print(' -a Print all stats.') > > print(' -r Reset stats after printing them.') > > print(' -s Print subdevice status.') > > print(' -g Invoke GC before printing status.') > > print('By default, print only the total stats.') > > > >def main(): > > '''Main function''' > > global SYSFS_BCACHE_PATH > > global uuid_map, devnum_map > > stats = set() > > reset_stats = False > > print_subdevices = False > > run_gc = False > > > > for arg in sys.argv[1:]: > > if arg == '--help': > > print_help() > > return 0 > > elif arg == '-f': > > stats.add('five_minute') > > elif arg == '-h': > > stats.add('hour') > > elif arg == '-d': > > stats.add('day') > > elif arg == '-t': > > stats.add('total') > > elif arg == '-a': > > stats.add('five_minute') > > stats.add('hour') > > stats.add('day') > > stats.add('total') > > elif arg == '-r': > > reset_stats = True > > elif arg == '-s': > > print_subdevices = True > > elif arg == '-g': > > run_gc = True > > else: > > print_help() > > return 0 > > if len(stats) == 0: > > stats.add('total') > > > > uuid_map = map_uuid_to_device() > > devnum_map = map_devnum_to_device() > > for cache in os.listdir(SYSFS_BCACHE_PATH): > > if not os.path.isdir('%s%s' % (SYSFS_BCACHE_PATH, cache)): > > continue > > > > if run_gc: > > with open('%s%s/internal/trigger_gc' % (SYSFS_BCACHE_PATH, cache), 'w') as fd: > > fd.write('1\n') > > > > dump_bcache('%s%s' % (SYSFS_BCACHE_PATH, cache), stats, print_subdevices, uuid_map.get(cache, '?')) > > > > if reset_stats: > > with open('%s%s/clear_stats' % (SYSFS_BCACHE_PATH, cache), 'w') as fd: > > fd.write('1\n') > > > >SYSFS_BCACHE_PATH = '/sys/fs/bcache/' > >SYSFS_BLOCK_PATH = '/sys/block/' > >DEV_BLOCK_PATH = '/dev/block/' > >if __name__ == '__main__': > > main() > > > >-- > >To unsubscribe from this list: send the line "unsubscribe linux-bcache" in > >the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org > >More majordomo info at http://vger.kernel.org/majordomo-info.html > Hi Darrick, > > > A very useful script indeed. > > We made the following changes: > > - Removed "Device" from under cache-set header > - Added "bcache Device" to Backing Device section > - Changed "Device" to "Physical Device" in Backing Device section "Device File"? There's nothing requiring the inputs to a cache set be *physical* devices at all. > - Removed "Cache Mode" from cache-set header as it set per backing device I realize that; if all the backing devices have the same cache mode then it'll print that, otherwise it prints "unknown". Come to think of it, that really ought to be "various" or something. > We will make some more changes in the coming weeks to implement a > brief display mode as well as a verbose display mode. Cool, thanks. I'm glad you can get some use out of it. --D > > Patch inline: > > --- /usr/local/bin/bcache-status 2013-08-16 11:51:55.281095640 +1200 > +++ bcache-status 2013-08-16 17:00:28.884020997 +1200 > @@ -64,11 +64,16 @@ > def pretty_size(x): > return format_sectors(interpret_sectors(x)) > > +def device_path(x): > + x="/dev/block/%s" % x > + return os.path.abspath(os.path.join(os.path.dirname(x), > os.readlink(x))) > + > def dump_bdev(bdev_path): > '''Dump a backing device stats.''' > global MAX_KEY_LENGTH, devnum_map > attrs = [ > - ('../dev', 'Device', lambda x: '%s > (%s)' % (devnum_map.get(x, '?'), x)), > + ('dev/dev', 'bcache Device', device_path), > + ('../dev', 'Physical Device', lambda x: > '%s (%s)' % (devnum_map.get(x, '?'), x)), > ('../size', 'Size', format_sectors), > ('cache_mode', 'Cache Mode', None), > ('readahead', 'Readahead', None), > @@ -180,7 +185,7 @@ > return '%s\t(%d%%)' % (format_sectors(val), 100.0 * > val / cache_sectors) > > attrs = [ > - (None, 'Device', lambda x: '%s (%s)' > % (devnum_map.get(device, '?'), device)), > + #(None, 'Device', lambda x: '%s (%s)' > % (devnum_map.get(device, '?'), device)), > (None, 'UUID', lambda x: > os.path.basename(bcache_sysfs_path)), > ('block_size', 'Block > Size', pretty_size), > ('bucket_size', 'Bucket > Size', pretty_size), > @@ -268,8 +273,8 @@ > print('Usage: %s [OPTIONS]' % sys.argv[0]) > print('Options:') > print(' -f Print the last five minutes of stats.') > - print(' -d Print the last hour of stats.') > - print(' -h Print the last day of stats.') > + print(' -h Print the last hour of stats.') > + print(' -d Print the last day of stats.') > print(' -t Print total stats.') > print(' -a Print all stats.') > print(' -r Reset stats after printing them.') > > > Regards, > > > > > > > > Andrew ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [RFC] bcache-status [not found] ` <20130815233508.GB6949-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org> 2013-08-16 5:09 ` Andrew Thrift @ 2013-08-19 11:48 ` Damien Churchill 1 sibling, 0 replies; 23+ messages in thread From: Damien Churchill @ 2013-08-19 11:48 UTC (permalink / raw) To: Darrick J. Wong; +Cc: Kent Overstreet, bcache Hi, On 16 August 2013 00:35, Darrick J. Wong <darrick.wong-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> wrote: > Hi all, > > I wrote a script to dump out various stats about a bcache. I've put your script in a gist[0] and modified a few things, all cosmetic. Switched to use argparse and changed a few conditionals to be slightly more pythonic. [0] https://gist.github.com/damoxc/6267899 ^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2013-09-11 15:51 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-25 19:07 bcache-tools package for Fedora Rolf Fokkens
[not found] ` <521A55D4.20908-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>
2013-08-25 20:39 ` [RFC] bcache-status Rolf Fokkens
[not found] ` <521A6B92.60001-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>
2013-08-26 16:30 ` Darrick J. Wong
[not found] ` <20130826163055.GB4780-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org>
2013-08-26 20:36 ` Rolf Fokkens
[not found] ` <521BBC3B.9010003-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>
2013-08-29 0:46 ` Darrick J. Wong
[not found] ` <20130829004646.GA3099-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org>
2013-09-03 20:46 ` Rolf Fokkens
[not found] ` <52264AAD.3050401-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>
2013-09-04 20:26 ` Darrick J. Wong
[not found] ` <20130904202600.GA4554-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org>
2013-09-04 20:52 ` Rolf Fokkens
[not found] ` <52279DA5.7050505-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>
2013-09-05 6:14 ` Stefan Priebe - Profihost AG
2013-09-09 22:45 ` Darrick J. Wong
2013-08-26 23:01 ` Rolf Fokkens
2013-09-05 6:53 ` bcache-tools package for Fedora / status probe-bcache Rolf Fokkens
[not found] ` <52282A87.4000801-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>
2013-09-05 10:16 ` Gabriel de Perthuis
[not found] ` <52285A03.7080802-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-09-05 10:36 ` Rolf Fokkens
[not found] ` <FEBD3400-93F1-4286-8BE8-45D5413C2EA2-6w2rdlBuEQTpMFipWq+H6g@public.gmane.org>
2013-09-05 10:53 ` Gabriel de Perthuis
[not found] ` <52286299.7000708-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-09-09 13:26 ` Karel Zak
[not found] ` <20130909132653.GA8061-s5vVilr7EKH/9pzu0YdTqQ@public.gmane.org>
2013-09-09 15:28 ` Gabriel de Perthuis
[not found] ` <522DE939.5090009-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-09-11 11:59 ` Rolf Fokkens
2013-09-11 15:51 ` Karel Zak
-- strict thread matches above, loose matches on Subject: below --
2013-08-15 23:35 [RFC] bcache-status Darrick J. Wong
[not found] ` <20130815233508.GB6949-yuuUpGxbzT9UbpRmUfBrXUB+6BGkLq7r@public.gmane.org>
2013-08-16 5:09 ` Andrew Thrift
[not found] ` <520DB3EC.70001-3e6jenk95VYpDvLZ8AWkcaVXKuFTiq87@public.gmane.org>
2013-08-16 21:35 ` Darrick J. Wong
2013-08-19 11:48 ` Damien Churchill
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox