<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.lustre.org/index.php?action=history&amp;feed=atom&amp;title=Lustre_IO_Monitoring</id>
	<title>Lustre IO Monitoring - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.lustre.org/index.php?action=history&amp;feed=atom&amp;title=Lustre_IO_Monitoring"/>
	<link rel="alternate" type="text/html" href="http://wiki.lustre.org/index.php?title=Lustre_IO_Monitoring&amp;action=history"/>
	<updated>2026-08-05T15:03:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>http://wiki.lustre.org/index.php?title=Lustre_IO_Monitoring&amp;diff=5467&amp;oldid=prev</id>
		<title>Elliswilson: Created page with &quot;__TOC__  == Overview ==  Lustre exposes detailed I/O statistics at multiple layers — client, RPC, and server. Understanding these statistics is essential for diagnosing performance problems, identifying bottlenecks, and validating tuning changes.  This page focuses on &#039;&#039;interpreting&#039;&#039; the stats. For a broader monitoring overview, see the Lustre Monitoring and Statistics Guide. For tuning guidance, see Lustre Tuning.  == Client-Side Statistics (llite) ==  Client...&quot;</title>
		<link rel="alternate" type="text/html" href="http://wiki.lustre.org/index.php?title=Lustre_IO_Monitoring&amp;diff=5467&amp;oldid=prev"/>
		<updated>2026-04-30T16:28:37Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;__TOC__  == Overview ==  Lustre exposes detailed I/O statistics at multiple layers — client, RPC, and server. Understanding these statistics is essential for diagnosing performance problems, identifying bottlenecks, and validating tuning changes.  This page focuses on &amp;#039;&amp;#039;interpreting&amp;#039;&amp;#039; the stats. For a broader monitoring overview, see the &lt;a href=&quot;/Lustre_Monitoring_and_Statistics_Guide&quot; title=&quot;Lustre Monitoring and Statistics Guide&quot;&gt;Lustre Monitoring and Statistics Guide&lt;/a&gt;. For tuning guidance, see &lt;a href=&quot;/Lustre_Tuning&quot; title=&quot;Lustre Tuning&quot;&gt;Lustre Tuning&lt;/a&gt;.  == Client-Side Statistics (llite) ==  Client...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
Lustre exposes detailed I/O statistics at multiple layers — client, RPC, and server. Understanding these statistics is essential for diagnosing performance problems, identifying bottlenecks, and validating tuning changes.&lt;br /&gt;
&lt;br /&gt;
This page focuses on &amp;#039;&amp;#039;interpreting&amp;#039;&amp;#039; the stats. For a broader monitoring overview, see the [[Lustre Monitoring and Statistics Guide]]. For tuning guidance, see [[Lustre Tuning]].&lt;br /&gt;
&lt;br /&gt;
== Client-Side Statistics (llite) ==&lt;br /&gt;
&lt;br /&gt;
Client stats show how applications interact with the Lustre filesystem:&lt;br /&gt;
&lt;br /&gt;
 lctl get_param llite.*.stats&lt;br /&gt;
&lt;br /&gt;
Key counters:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Counter&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;read_bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
| Total bytes read by applications&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;write_bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
| Total bytes written by applications&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;&lt;br /&gt;
| Number of file open operations&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;close&amp;lt;/code&amp;gt;&lt;br /&gt;
| Number of file close operations&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt;&lt;br /&gt;
| Number of memory-mapped I/O operations&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;seek&amp;lt;/code&amp;gt;&lt;br /&gt;
| Number of lseek calls&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fsync&amp;lt;/code&amp;gt;&lt;br /&gt;
| Number of fsync calls (can indicate write-barrier-heavy workloads)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
| Number of truncate operations&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setattr&amp;lt;/code&amp;gt;&lt;br /&gt;
| Number of attribute changes (chmod, chown, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getattr&amp;lt;/code&amp;gt;&lt;br /&gt;
| Number of attribute reads (stat calls)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
To reset client stats:&lt;br /&gt;
&lt;br /&gt;
 lctl set_param llite.*.stats=clear&lt;br /&gt;
&lt;br /&gt;
=== Reading the Output Format ===&lt;br /&gt;
&lt;br /&gt;
Each stat line shows:&lt;br /&gt;
&lt;br /&gt;
 {count} samples [{unit}] {min} {max} {sum} {sumsq}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
 read_bytes    500 samples [bytes] 4096 1048576 209715200 ...&lt;br /&gt;
&lt;br /&gt;
This means 500 read operations occurred, with the smallest read being 4 KB, the largest 1 MB, and a total of 200 MB read.&lt;br /&gt;
&lt;br /&gt;
== RPC Statistics (osc) ==&lt;br /&gt;
&lt;br /&gt;
RPC stats reveal how the client packages I/O into RPCs sent to OSTs:&lt;br /&gt;
&lt;br /&gt;
 lctl get_param osc.*.rpc_stats&lt;br /&gt;
&lt;br /&gt;
This produces histogram output with several sections:&lt;br /&gt;
&lt;br /&gt;
=== Pages per RPC ===&lt;br /&gt;
&lt;br /&gt;
Shows the distribution of RPC sizes in pages (typically 4 KB each):&lt;br /&gt;
&lt;br /&gt;
 pages per rpc         rpcs   % cumulative %&lt;br /&gt;
 1:                     150  15  15&lt;br /&gt;
 2:                      50   5  20&lt;br /&gt;
 ...&lt;br /&gt;
 256:                   500  50 100&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What to look for:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* A healthy large-file workload should show most RPCs at the maximum size (256 pages = 1 MB by default).&lt;br /&gt;
* A high percentage of small RPCs (1-4 pages) indicates the application is doing small, non-sequential I/O. Consider increasing &amp;lt;code&amp;gt;max_pages_per_rpc&amp;lt;/code&amp;gt; or adjusting the application&amp;#039;s I/O pattern.&lt;br /&gt;
&lt;br /&gt;
=== RPCs in Flight ===&lt;br /&gt;
&lt;br /&gt;
Shows how many RPCs are concurrently in flight:&lt;br /&gt;
&lt;br /&gt;
 rpcs in flight        rpcs   % cumulative %&lt;br /&gt;
 1:                     200  20  20&lt;br /&gt;
 2:                     300  30  50&lt;br /&gt;
 ...&lt;br /&gt;
 8:                     100  10 100&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What to look for:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* If most RPCs are at depth 1, the client may be I/O latency-bound. Consider increasing &amp;lt;code&amp;gt;max_rpcs_in_flight&amp;lt;/code&amp;gt; (default 8).&lt;br /&gt;
* If the histogram is concentrated at the maximum value, the client is fully utilizing its RPC pipeline — the bottleneck is likely on the server side or the network.&lt;br /&gt;
&lt;br /&gt;
=== Offset Distribution ===&lt;br /&gt;
&lt;br /&gt;
Shows whether I/O is sequential or random:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What to look for:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Sequential workloads show offsets that increase monotonically.&lt;br /&gt;
* Random workloads show a flat offset distribution across the file.&lt;br /&gt;
&lt;br /&gt;
== Server-Side BRW Statistics (obdfilter) ==&lt;br /&gt;
&lt;br /&gt;
BRW (Bulk Read/Write) stats show the actual disk I/O patterns on the OSS:&lt;br /&gt;
&lt;br /&gt;
 lctl get_param obdfilter.*.brw_stats&lt;br /&gt;
&lt;br /&gt;
Sections include:&lt;br /&gt;
&lt;br /&gt;
=== Disk I/O Size ===&lt;br /&gt;
&lt;br /&gt;
 disk I/O size          ios   % cumulative %&lt;br /&gt;
 4K:                    100  10  10&lt;br /&gt;
 8K:                     50   5  15&lt;br /&gt;
 ...&lt;br /&gt;
 1M:                    500  50 100&lt;br /&gt;
&lt;br /&gt;
* Large I/O sizes (512 KB–1 MB) indicate efficient bulk transfer.&lt;br /&gt;
* Many small I/O sizes suggest fragmentation, small-file workloads, or clients sending suboptimal RPCs.&lt;br /&gt;
&lt;br /&gt;
=== Contiguous vs. Non-Contiguous Access ===&lt;br /&gt;
&lt;br /&gt;
Shows whether I/O requests from clients target contiguous disk regions:&lt;br /&gt;
&lt;br /&gt;
* High contiguous access percentages indicate sequential I/O — good for throughput.&lt;br /&gt;
* High non-contiguous (discontinuous) access means the server is seeking — a potential performance bottleneck on HDDs (less impactful on SSDs).&lt;br /&gt;
&lt;br /&gt;
=== I/O Time ===&lt;br /&gt;
&lt;br /&gt;
Shows the time distribution for completing I/O operations:&lt;br /&gt;
&lt;br /&gt;
* Look for long-tail latencies that could indicate slow disks, RAID rebuilds, or resource contention.&lt;br /&gt;
&lt;br /&gt;
== Interpreting the Histogram Format ==&lt;br /&gt;
&lt;br /&gt;
All Lustre stats histograms use the same format:&lt;br /&gt;
&lt;br /&gt;
 {bucket_label}:  {count}  {percentage}  {cumulative_percentage}&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;count&amp;#039;&amp;#039;&amp;#039; — number of operations in this bucket.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;percentage&amp;#039;&amp;#039;&amp;#039; — fraction of total operations in this bucket.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;cumulative percentage&amp;#039;&amp;#039;&amp;#039; — running total; 100% at the last bucket.&lt;br /&gt;
&lt;br /&gt;
The bucket labels are powers of 2 (1, 2, 4, 8, 16, ...) representing pages, bytes, or microseconds depending on the section.&lt;br /&gt;
&lt;br /&gt;
== Common Performance Anti-Patterns ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom&lt;br /&gt;
! Where to Look&lt;br /&gt;
! Likely Cause&lt;br /&gt;
|-&lt;br /&gt;
| Many small RPCs&lt;br /&gt;
| &amp;lt;code&amp;gt;osc.*.rpc_stats&amp;lt;/code&amp;gt; (pages per rpc)&lt;br /&gt;
| Application doing small random I/O; misaligned I/O; stripe size too small&lt;br /&gt;
|-&lt;br /&gt;
| Low RPCs in flight&lt;br /&gt;
| &amp;lt;code&amp;gt;osc.*.rpc_stats&amp;lt;/code&amp;gt; (rpcs in flight)&lt;br /&gt;
| &amp;lt;code&amp;gt;max_rpcs_in_flight&amp;lt;/code&amp;gt; too low; single-threaded application&lt;br /&gt;
|-&lt;br /&gt;
| High queue depth on server&lt;br /&gt;
| &amp;lt;code&amp;gt;obdfilter.*.brw_stats&amp;lt;/code&amp;gt;&lt;br /&gt;
| Server overloaded; too many clients; slow storage backend&lt;br /&gt;
|-&lt;br /&gt;
| Imbalanced I/O across OSTs&lt;br /&gt;
| &amp;lt;code&amp;gt;lfs df&amp;lt;/code&amp;gt; or per-OST stats&lt;br /&gt;
| Uneven striping; hot files on specific OSTs; OST QoS weights&lt;br /&gt;
|-&lt;br /&gt;
| High getattr/setattr rate&lt;br /&gt;
| &amp;lt;code&amp;gt;llite.*.stats&amp;lt;/code&amp;gt;&lt;br /&gt;
| Metadata-heavy workload (e.g., &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt; on large directories); consider MDT tuning&lt;br /&gt;
|-&lt;br /&gt;
| Many fsync calls&lt;br /&gt;
| &amp;lt;code&amp;gt;llite.*.stats&amp;lt;/code&amp;gt;&lt;br /&gt;
| Application forcing write barriers; affects throughput significantly&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Collecting Stats Over Time ==&lt;br /&gt;
&lt;br /&gt;
To capture a baseline and then measure a workload:&lt;br /&gt;
&lt;br /&gt;
 # Clear stats&lt;br /&gt;
 lctl set_param llite.*.stats=clear&lt;br /&gt;
 lctl set_param osc.*.rpc_stats=clear&lt;br /&gt;
&lt;br /&gt;
 # Run workload&lt;br /&gt;
 # ...&lt;br /&gt;
&lt;br /&gt;
 # Collect stats&lt;br /&gt;
 lctl get_param llite.*.stats &amp;gt; /tmp/llite_stats.txt&lt;br /&gt;
 lctl get_param osc.*.rpc_stats &amp;gt; /tmp/rpc_stats.txt&lt;br /&gt;
&lt;br /&gt;
On servers:&lt;br /&gt;
&lt;br /&gt;
 lctl set_param obdfilter.*.brw_stats=clear&lt;br /&gt;
 # ... (after workload)&lt;br /&gt;
 lctl get_param obdfilter.*.brw_stats &amp;gt; /tmp/brw_stats.txt&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[Lustre Monitoring and Statistics Guide]]&lt;br /&gt;
* [[Lustre Tuning]]&lt;br /&gt;
* [[Lustre Health Checks]]&lt;br /&gt;
* [[Lustre Striping Best Practices]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Administration]]&lt;br /&gt;
[[Category:Monitoring]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Elliswilson</name></author>
	</entry>
</feed>