2009-04-21 02:03:36

by Kevin Constantine

[permalink] [raw]
Subject: [PATCH 2/2] nfs-iostat.py: Added bytes written output

Print statistics about bytes written by NFS

Signed-off-by: Kevin Constantine <kevin.constantine-FfNkGbSheRGpB8w63BLUukEOCMrvLtNR@public.gmane.org>
---
tools/nfs-iostat/nfs-iostat.py | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py
index d331a72..5f2e232 100644
--- a/tools/nfs-iostat/nfs-iostat.py
+++ b/tools/nfs-iostat/nfs-iostat.py
@@ -221,6 +221,7 @@ class DeviceData:
"""
nfs_stats = self.__nfs_data
app_bytes_read = float(nfs_stats['normalreadbytes'] + nfs_stats['directreadbytes'])
+ bytes_written_by_app = float(nfs_stats['normalwritebytes'] + nfs_stats['directwritebytes'])
if app_bytes_read != 0:
read_bytes_from_server = float(nfs_stats['serverreadbytes'])
directio_bytes_from_server = float(nfs_stats['directreadbytes'])
@@ -234,6 +235,15 @@ class DeviceData:
cached_read_bytes / 1024.0 / 1024.0, \
app_bytes_read / 1024.0 / 1024.0, \
ratio)
+ if bytes_written_by_app != 0:
+ bytes_written_by_nfs = float(nfs_stats['serverwritebytes'])
+ cached_write_bytes = float(bytes_written_by_app - bytes_written_by_nfs);
+ print
+ print '%13s %12s %15s %15s' % ("Data Written:", "To Server", "To Cache", "Total")
+ print '%10s %13.4fMB %13.4fMB %13.4fMB' % ("", \
+ bytes_written_by_nfs / 1024.0 / 1024.0, \
+ cached_write_bytes / 1024.0 / 1024.0, \
+ bytes_written_by_app / 1024.0 / 1024.0)

def __print_attr_cache_stats(self, sample_time):
"""Print attribute cache efficiency stats
--
1.6.2.1



2009-04-21 20:46:24

by Chuck Lever

[permalink] [raw]
Subject: Re: [PATCH 2/2] nfs-iostat.py: Added bytes written output

On Apr 21, 2009, at 4:39 PM, Kevin Constantine wrote:
> Chuck Lever wrote:
>> On Apr 21, 2009, at 1:57 PM, Kevin Constantine wrote:
>>> Chuck Lever wrote:
>>>> On Apr 20, 2009, at 10:03 PM, Kevin Constantine wrote:
>>>>> Print statistics about bytes written by NFS
>>>>>
>>>>> Signed-off-by: Kevin Constantine <[email protected]
>>>>> >
>>>>> ---
>>>>> tools/nfs-iostat/nfs-iostat.py | 10 ++++++++++
>>>>> 1 files changed, 10 insertions(+), 0 deletions(-)
>>>>>
>>>>> diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/
>>>>> nfs-iostat.py
>>>>> index d331a72..5f2e232 100644
>>>>> --- a/tools/nfs-iostat/nfs-iostat.py
>>>>> +++ b/tools/nfs-iostat/nfs-iostat.py
>>>>> @@ -221,6 +221,7 @@ class DeviceData:
>>>>> """
>>>>> nfs_stats = self.__nfs_data
>>>>> app_bytes_read = float(nfs_stats['normalreadbytes'] +
>>>>> nfs_stats['directreadbytes'])
>>>>> + bytes_written_by_app =
>>>>> float(nfs_stats['normalwritebytes'] +
>>>>> nfs_stats['directwritebytes'])
>>>>> if app_bytes_read != 0:
>>>>> read_bytes_from_server =
>>>>> float(nfs_stats['serverreadbytes'])
>>>>> directio_bytes_from_server =
>>>>> float(nfs_stats['directreadbytes'])
>>>>> @@ -234,6 +235,15 @@ class DeviceData:
>>>>> cached_read_bytes / 1024.0 / 1024.0, \
>>>>> app_bytes_read / 1024.0 / 1024.0, \
>>>>> ratio)
>>>>> + if bytes_written_by_app != 0:
>>>>> + bytes_written_by_nfs =
>>>>> float(nfs_stats['serverwritebytes'])
>>>>> + cached_write_bytes = float(bytes_written_by_app -
>>>>> bytes_written_by_nfs);
>>>> Again, I don't see why this computation is necessary: The
>>>> "normalwritebytes" statistic is what was written through the
>>>> client's cache, and "directwritebytes" counts the number of bytes
>>>> that were written via O_DIRECT.
>>>
>>> As I said in the email preceding these patches:
>>> "I'm not quire sure about this patch. I'm seeing oddities where
>>> the number of bytes in "NORMALWRITTENBYTES + DIRECTWRITTENBYTES"
>>> does not equal SERVERWRITTENBYTES. In some cases the amount of
>>> data written by the app (normalwrittenbytes + directwrittenbytes)
>>> is greater than the amount of data written to the server, and in
>>> other cases it's less than the amount of data written to the
>>> server. At the moment, i've ascribed that difference to data
>>> being written to the local cache and not flushed, but that doesn't
>>> make a whole lot of sense."
>> Our e-mail system may have barfed on my earlier reply, but I would
>> like to understand why you need this statistic. What kind of
>> analysis are you looking for on the write side?
>>
>
> As far as writes go, all I really wanted to print is MB being
> written to the nfs server. But I noticed along the way that the
> values don't add up and found it odd.
>
> An application writing data to an nfs server should be getting
> counted by either normalwrittenbytes, or directwrittenbytes. The
> data being written by the nfs by an NFS write request should be
> counted by serverwrittenbytes. normal + direct should equal server,
> but it doesn't, and I'm wondering what happened to those bytes.
> Sometimes normal + direct > server, sometimes normal + direct <
> server.
>
> What I have in the patch doesn't really matter because I don't
> understand the imbalance in the counters.

If you want to see how much data is going from the client to the
server, use serverwrittenbytes. No user-space computation is required.

The other two measure data coming in from system calls. The VFS and
the NFS client do some write caching. The instantaneous sum of these
two will not always be the same as what is written on the wire.

> -kevin
>
>>>
>>>>> + print
>>>>> + print '%13s %12s %15s %15s' % ("Data Written:", "To
>>>>> Server", "To Cache", "Total")
>>>>> + print '%10s %13.4fMB %13.4fMB %13.4fMB' % ("", \
>>>>> + bytes_written_by_nfs / 1024.0 /
>>>>> 1024.0, \
>>>>> + cached_write_bytes / 1024.0 / 1024.0, \
>>>>> + bytes_written_by_app / 1024.0 / 1024.0)
>>>>>
>>>>> def __print_attr_cache_stats(self, sample_time):
>>>>> """Print attribute cache efficiency stats
>> --
>> Chuck Lever
>> chuck[dot]lever[at]oracle[dot]com

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com





2009-04-21 14:26:39

by Chuck Lever

[permalink] [raw]
Subject: Re: [PATCH 2/2] nfs-iostat.py: Added bytes written output

On Apr 20, 2009, at 10:03 PM, Kevin Constantine wrote:
> Print statistics about bytes written by NFS
>
> Signed-off-by: Kevin Constantine <kevin.constantine-FfNkGbSheRGpB8w63BLUukEOCMrvLtNR@public.gmane.org
> >
> ---
> tools/nfs-iostat/nfs-iostat.py | 10 ++++++++++
> 1 files changed, 10 insertions(+), 0 deletions(-)
>
> diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-
> iostat.py
> index d331a72..5f2e232 100644
> --- a/tools/nfs-iostat/nfs-iostat.py
> +++ b/tools/nfs-iostat/nfs-iostat.py
> @@ -221,6 +221,7 @@ class DeviceData:
> """
> nfs_stats = self.__nfs_data
> app_bytes_read = float(nfs_stats['normalreadbytes'] +
> nfs_stats['directreadbytes'])
> + bytes_written_by_app = float(nfs_stats['normalwritebytes']
> + nfs_stats['directwritebytes'])
> if app_bytes_read != 0:
> read_bytes_from_server =
> float(nfs_stats['serverreadbytes'])
> directio_bytes_from_server =
> float(nfs_stats['directreadbytes'])
> @@ -234,6 +235,15 @@ class DeviceData:
> cached_read_bytes / 1024.0 / 1024.0, \
> app_bytes_read / 1024.0 / 1024.0, \
> ratio)
> + if bytes_written_by_app != 0:
> + bytes_written_by_nfs = float(nfs_stats['serverwritebytes'])
> + cached_write_bytes = float(bytes_written_by_app -
> bytes_written_by_nfs);

Again, I don't see why this computation is necessary: The
"normalwritebytes" statistic is what was written through the client's
cache, and "directwritebytes" counts the number of bytes that were
written via O_DIRECT.

> + print
> + print '%13s %12s %15s %15s' % ("Data Written:", "To
> Server", "To Cache", "Total")
> + print '%10s %13.4fMB %13.4fMB %13.4fMB' % ("", \
> + bytes_written_by_nfs / 1024.0 / 1024.0, \
> + cached_write_bytes / 1024.0 / 1024.0, \
> + bytes_written_by_app / 1024.0 / 1024.0)
>
> def __print_attr_cache_stats(self, sample_time):
> """Print attribute cache efficiency stats
> --
> 1.6.2.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs"
> in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com





2009-04-21 17:57:21

by Kevin Constantine

[permalink] [raw]
Subject: Re: [PATCH 2/2] nfs-iostat.py: Added bytes written output

Chuck Lever wrote:
> On Apr 20, 2009, at 10:03 PM, Kevin Constantine wrote:
>> Print statistics about bytes written by NFS
>>
>> Signed-off-by: Kevin Constantine <kevin.constantine-FfNkGbSheRGpB8w63BLUukEOCMrvLtNR@public.gmane.org>
>> ---
>> tools/nfs-iostat/nfs-iostat.py | 10 ++++++++++
>> 1 files changed, 10 insertions(+), 0 deletions(-)
>>
>> diff --git a/tools/nfs-iostat/nfs-iostat.py
>> b/tools/nfs-iostat/nfs-iostat.py
>> index d331a72..5f2e232 100644
>> --- a/tools/nfs-iostat/nfs-iostat.py
>> +++ b/tools/nfs-iostat/nfs-iostat.py
>> @@ -221,6 +221,7 @@ class DeviceData:
>> """
>> nfs_stats = self.__nfs_data
>> app_bytes_read = float(nfs_stats['normalreadbytes'] +
>> nfs_stats['directreadbytes'])
>> + bytes_written_by_app = float(nfs_stats['normalwritebytes'] +
>> nfs_stats['directwritebytes'])
>> if app_bytes_read != 0:
>> read_bytes_from_server = float(nfs_stats['serverreadbytes'])
>> directio_bytes_from_server =
>> float(nfs_stats['directreadbytes'])
>> @@ -234,6 +235,15 @@ class DeviceData:
>> cached_read_bytes / 1024.0 / 1024.0, \
>> app_bytes_read / 1024.0 / 1024.0, \
>> ratio)
>> + if bytes_written_by_app != 0:
>> + bytes_written_by_nfs = float(nfs_stats['serverwritebytes'])
>> + cached_write_bytes = float(bytes_written_by_app -
>> bytes_written_by_nfs);
>
> Again, I don't see why this computation is necessary: The
> "normalwritebytes" statistic is what was written through the client's
> cache, and "directwritebytes" counts the number of bytes that were
> written via O_DIRECT.
>

As I said in the email preceding these patches:
"I'm not quire sure about this patch. I'm seeing oddities where the number of bytes in "NORMALWRITTENBYTES +
DIRECTWRITTENBYTES" does not equal SERVERWRITTENBYTES. In some cases the amount of data written by the app
(normalwrittenbytes + directwrittenbytes) is greater than the amount of data written to the server, and in other cases
it's less than the amount of data written to the server. At the moment, i've ascribed that difference to data being
written to the local cache and not flushed, but that doesn't make a whole lot of sense."

-kevin

>> + print
>> + print '%13s %12s %15s %15s' % ("Data Written:", "To
>> Server", "To Cache", "Total")
>> + print '%10s %13.4fMB %13.4fMB %13.4fMB' % ("", \
>> + bytes_written_by_nfs / 1024.0 / 1024.0, \
>> + cached_write_bytes / 1024.0 / 1024.0, \
>> + bytes_written_by_app / 1024.0 / 1024.0)
>>
>> def __print_attr_cache_stats(self, sample_time):
>> """Print attribute cache efficiency stats
>> --
>> 1.6.2.1
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
>> the body of a message to [email protected]
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>

--
------------------------------------------------------------
Kevin Constantine

Systems Engineer t: 818.460.8221
Walt Disney Animation Studios e: kevin.constantine-P5ys19MLBK/[email protected]

Any sufficiently advanced technology is indistinguishable from magic.
- Arthur C. Clarke

2009-04-21 20:06:20

by Chuck Lever

[permalink] [raw]
Subject: Re: [PATCH 2/2] nfs-iostat.py: Added bytes written output

On Apr 21, 2009, at 1:57 PM, Kevin Constantine wrote:
> Chuck Lever wrote:
>> On Apr 20, 2009, at 10:03 PM, Kevin Constantine wrote:
>>> Print statistics about bytes written by NFS
>>>
>>> Signed-off-by: Kevin Constantine <kevin.constantine-FfNkGbSheRGpB8w63BLUukEOCMrvLtNR@public.gmane.org
>>> >
>>> ---
>>> tools/nfs-iostat/nfs-iostat.py | 10 ++++++++++
>>> 1 files changed, 10 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-
>>> iostat.py
>>> index d331a72..5f2e232 100644
>>> --- a/tools/nfs-iostat/nfs-iostat.py
>>> +++ b/tools/nfs-iostat/nfs-iostat.py
>>> @@ -221,6 +221,7 @@ class DeviceData:
>>> """
>>> nfs_stats = self.__nfs_data
>>> app_bytes_read = float(nfs_stats['normalreadbytes'] +
>>> nfs_stats['directreadbytes'])
>>> + bytes_written_by_app =
>>> float(nfs_stats['normalwritebytes'] + nfs_stats['directwritebytes'])
>>> if app_bytes_read != 0:
>>> read_bytes_from_server =
>>> float(nfs_stats['serverreadbytes'])
>>> directio_bytes_from_server =
>>> float(nfs_stats['directreadbytes'])
>>> @@ -234,6 +235,15 @@ class DeviceData:
>>> cached_read_bytes / 1024.0 / 1024.0, \
>>> app_bytes_read / 1024.0 / 1024.0, \
>>> ratio)
>>> + if bytes_written_by_app != 0:
>>> + bytes_written_by_nfs = float(nfs_stats['serverwritebytes'])
>>> + cached_write_bytes = float(bytes_written_by_app -
>>> bytes_written_by_nfs);
>> Again, I don't see why this computation is necessary: The
>> "normalwritebytes" statistic is what was written through the
>> client's cache, and "directwritebytes" counts the number of bytes
>> that were written via O_DIRECT.
>
> As I said in the email preceding these patches:
> "I'm not quire sure about this patch. I'm seeing oddities where the
> number of bytes in "NORMALWRITTENBYTES + DIRECTWRITTENBYTES" does
> not equal SERVERWRITTENBYTES. In some cases the amount of data
> written by the app (normalwrittenbytes + directwrittenbytes) is
> greater than the amount of data written to the server, and in other
> cases it's less than the amount of data written to the server. At
> the moment, i've ascribed that difference to data being written to
> the local cache and not flushed, but that doesn't make a whole lot
> of sense."

Our e-mail system may have barfed on my earlier reply, but I would
like to understand why you need this statistic. What kind of analysis
are you looking for on the write side?

>
>>> + print
>>> + print '%13s %12s %15s %15s' % ("Data Written:", "To
>>> Server", "To Cache", "Total")
>>> + print '%10s %13.4fMB %13.4fMB %13.4fMB' % ("", \
>>> + bytes_written_by_nfs / 1024.0 /
>>> 1024.0, \
>>> + cached_write_bytes / 1024.0 / 1024.0, \
>>> + bytes_written_by_app / 1024.0 / 1024.0)
>>>
>>> def __print_attr_cache_stats(self, sample_time):
>>> """Print attribute cache efficiency stats

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com

2009-04-21 20:39:28

by Kevin Constantine

[permalink] [raw]
Subject: Re: [PATCH 2/2] nfs-iostat.py: Added bytes written output

Chuck Lever wrote:
> On Apr 21, 2009, at 1:57 PM, Kevin Constantine wrote:
>> Chuck Lever wrote:
>>> On Apr 20, 2009, at 10:03 PM, Kevin Constantine wrote:
>>>> Print statistics about bytes written by NFS
>>>>
>>>> Signed-off-by: Kevin Constantine
>>>> <kevin.constantine-FfNkGbSheRGpB8w63BLUukEOCMrvLtNR@public.gmane.org>
>>>> ---
>>>> tools/nfs-iostat/nfs-iostat.py | 10 ++++++++++
>>>> 1 files changed, 10 insertions(+), 0 deletions(-)
>>>>
>>>> diff --git a/tools/nfs-iostat/nfs-iostat.py
>>>> b/tools/nfs-iostat/nfs-iostat.py
>>>> index d331a72..5f2e232 100644
>>>> --- a/tools/nfs-iostat/nfs-iostat.py
>>>> +++ b/tools/nfs-iostat/nfs-iostat.py
>>>> @@ -221,6 +221,7 @@ class DeviceData:
>>>> """
>>>> nfs_stats = self.__nfs_data
>>>> app_bytes_read = float(nfs_stats['normalreadbytes'] +
>>>> nfs_stats['directreadbytes'])
>>>> + bytes_written_by_app = float(nfs_stats['normalwritebytes']
>>>> + nfs_stats['directwritebytes'])
>>>> if app_bytes_read != 0:
>>>> read_bytes_from_server = float(nfs_stats['serverreadbytes'])
>>>> directio_bytes_from_server =
>>>> float(nfs_stats['directreadbytes'])
>>>> @@ -234,6 +235,15 @@ class DeviceData:
>>>> cached_read_bytes / 1024.0 / 1024.0, \
>>>> app_bytes_read / 1024.0 / 1024.0, \
>>>> ratio)
>>>> + if bytes_written_by_app != 0:
>>>> + bytes_written_by_nfs = float(nfs_stats['serverwritebytes'])
>>>> + cached_write_bytes = float(bytes_written_by_app -
>>>> bytes_written_by_nfs);
>>> Again, I don't see why this computation is necessary: The
>>> "normalwritebytes" statistic is what was written through the client's
>>> cache, and "directwritebytes" counts the number of bytes that were
>>> written via O_DIRECT.
>>
>> As I said in the email preceding these patches:
>> "I'm not quire sure about this patch. I'm seeing oddities where the
>> number of bytes in "NORMALWRITTENBYTES + DIRECTWRITTENBYTES" does not
>> equal SERVERWRITTENBYTES. In some cases the amount of data written by
>> the app (normalwrittenbytes + directwrittenbytes) is greater than the
>> amount of data written to the server, and in other cases it's less
>> than the amount of data written to the server. At the moment, i've
>> ascribed that difference to data being written to the local cache and
>> not flushed, but that doesn't make a whole lot of sense."
>
> Our e-mail system may have barfed on my earlier reply, but I would like
> to understand why you need this statistic. What kind of analysis are
> you looking for on the write side?
>

As far as writes go, all I really wanted to print is MB being written to
the nfs server. But I noticed along the way that the values don't add
up and found it odd.

An application writing data to an nfs server should be getting counted
by either normalwrittenbytes, or directwrittenbytes. The data being
written by the nfs by an NFS write request should be counted by
serverwrittenbytes. normal + direct should equal server, but it
doesn't, and I'm wondering what happened to those bytes. Sometimes
normal + direct > server, sometimes normal + direct < server.

What I have in the patch doesn't really matter because I don't
understand the imbalance in the counters.

-kevin

>>
>>>> + print
>>>> + print '%13s %12s %15s %15s' % ("Data Written:", "To
>>>> Server", "To Cache", "Total")
>>>> + print '%10s %13.4fMB %13.4fMB %13.4fMB' % ("", \
>>>> + bytes_written_by_nfs / 1024.0 / 1024.0, \
>>>> + cached_write_bytes / 1024.0 / 1024.0, \
>>>> + bytes_written_by_app / 1024.0 / 1024.0)
>>>>
>>>> def __print_attr_cache_stats(self, sample_time):
>>>> """Print attribute cache efficiency stats
>
> --
> Chuck Lever
> chuck[dot]lever[at]oracle[dot]com