This shows you the differences between two versions of the page.
|
ep:labs:05:contents:tasks:ex1 [2025/02/11 23:42] cezar.craciunoiu |
ep:labs:05:contents:tasks:ex1 [2026/03/30 22:15] (current) radu.mantu |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ==== 01. [10p] Rotational delay - IOPS calculations ==== | + | ==== 01. [20p] iostat & iotop ==== |
| + | === [10p] Task A - Monitoring the behaviour with Iostat === | ||
| <note tip> | <note tip> | ||
| - | Every disk in your storage system has a maximum theoretical IOPS value that is based on a formula. Disk performance and IOPS is based on three key factors: | + | Parameteres for iostat: |
| - | + | * -x for extended statistics | |
| - | * **Rotational speed**. Measured in RPM, mostly 7,200, 10,000 or 15,000 RPM. A higher rotational speed is associated with a higher-performing disk. | + | * -d to display device stastistics only |
| - | * **Average latency**. The time it takes for the sector of the disk being accessed to rotate into position under a read/write head. | + | * -m for displaying r/w in MB/s |
| - | * **Average seek time**. The time (in ms) it takes for the hard drive’s read/write head to position itself over the track being read or written. | + | <code bash> |
| - | * **Average IOPS**: Divide 1 by the sum of the average latency in ms and the average seek time in ms (1 / (average latency in ms + average seek time in ms). | + | $ iostat -xdm |
| - | </note> | + | |
| - | To calculate the **IOPS range** divide 1 by the sum of the average latency in ms and the average seek time in ms. The formula is: | + | |
| - | <code>average IOPS = 1 / (average latency in ms + average seek time in ms). | + | |
| </code> | </code> | ||
| + | Use iostat with -p for specific device statistics: | ||
| + | <code bash> | ||
| + | $ iostat -xdm -p sda | ||
| + | </code> | ||
| + | </note> | ||
| - | Let's calculate the Rotational Delay - RD for a 10K RPM drive: | + | * Run //iostat -x 1 5//. |
| + | * Considering the last two outputs provided by the previous command, calculate **the efficiency of IOPS** for each of them. Does the amount of data written per I/O **increase** or **decrease**? | ||
| - | * Divide 10000 RPM by 60 seconds: **''10000/60 = 166 RPS''** | + | Add in your archive screenshot or pictures of the operations and the result you obtained, also showing the output of iostat from which you took the values. |
| - | * Convert 1 of 166 to decimal: **''1/166 = 0.006 seconds per Rotation''** | + | |
| - | * Multiply the seconds per rotation by 1000 milliseconds (6 MS per rotation). | + | |
| - | * Divide the total in half (RD is considered half a revolution around a disk): **''6/2 = 3 MS''** | + | |
| - | * Add an average of 3 MS for seek time: **''3 MS + 3 MS = 6 MS''** | + | |
| - | * Add 2 MS for latency (internal transfer): **''6 MS + 2 MS = 8 MS''** | + | |
| - | * Divide 1000 MS by 8 MS per I/O: **''1000/8 = 125 IOPS''** | + | |
| - | === [10p] Task A - Calculate rotational delay === | + | <note> |
| + | How to do: | ||
| - | Add in your archive the operations and the result you obtained. (Screenshot, picture of calculations made by hand on paper) | + | * Divide the kilobytes read (//rkB/s//) and written (//wkB/s//) per second by the reads per second (//r/s//) and the writes per second (//w/s//). |
| + | * If you happen to have quite a few [[https://en.wikipedia.org/wiki/Loop_device|loop devices]] in your **iostat** output, find out what they are exactly: | ||
| + | |||
| + | <code bash> | ||
| + | $ df -kh /dev/loop* | ||
| + | </code> | ||
| + | </note> | ||
| - | Calculate the Rotational Delay, and then the IOPS for a __5400 RPM drive__. | ||
| <solution -hidden> | <solution -hidden> | ||
| - | As shown in the //"Calculating IOs Per Second"// section: | + | The way to calculate the efficiency of IOPS is to divide the reads per second //(r/s)// and writes per second //(w/s)// by the kilobytes read //(rkB/s)// and written //(wkB/s)// per second. |
| + | |||
| + | Example: the amount of data written per I/O for ///dev/sda// increases during each iteration: | ||
| + | |||
| + | {{ :ep:labs:ep2017_l3_ex01.png?700 |}} | ||
| <code> | <code> | ||
| - | 5400 / 60 = 90 RPS | + | 53040/105 = 505KB per I/O |
| - | 1/90 = 0.011 seconds per Rotation | + | 71152/102 = 697KB per I/O |
| - | 0.011 * 1000 = 11ms per Rotation | + | |
| - | 11 / 2 = 5.5ms RD (Rotational Delay = half a revolution around a disk) | + | |
| - | add approx. 3ms seek time => 8.5ms | + | |
| - | add 2ms latency => 10.5ms | + | |
| - | Divide 1000ms by 10.5ms per I/O => approx. 95 IOPS | + | |
| </code> | </code> | ||
| + | |||
| + | If everything is zero in iostat - perform some I/O operations... | ||
| </solution> | </solution> | ||
| + | === [10p] Task B - Monitoring the behaviour with Iotop === | ||
| + | <note tip> | ||
| + | **Iotop** is an utility similar to top command, that interfaces with the kernel to provide per-thread/process I/O usage statistics. | ||
| + | <code> | ||
| + | Debian/Ubuntu Linux install iotop | ||
| + | $ sudo apt-get install iotop | ||
| + | |||
| + | How to use iotop command | ||
| + | $ sudo iotop OR $ iotop | ||
| + | </code> | ||
| + | |||
| + | Supported options by iotop command: | ||
| + | |||
| + | | **Options** | **Description** ^^ | ||
| + | | --version | show program’s version number and exit || | ||
| + | | -h, --help | show this help message and exit || | ||
| + | | -o, --only | only show processes or threads actually doing I/O || | ||
| + | | -b, --batch | non-interactive mode || | ||
| + | | -n NUM, --iter=NUM | number of iterations before ending [infinite] || | ||
| + | | -d SEC, --delay=SEC | delay between iterations [1 second] || | ||
| + | | -p PID, --pid=PID | processes/threads to monitor [all] || | ||
| + | | -u USER, --user=USER | users to monitor [all] || | ||
| + | | -P, --processes | only show processes, not all threads || | ||
| + | | -a, --accumulated | show accumulated I/O instead of bandwidth || | ||
| + | | -k, --kilobytes | use kilobytes instead of a human friendly unit || | ||
| + | | -t, --time | add a timestamp on each line (implies –batch) || | ||
| + | | -q, --quiet | suppress some lines of header (implies –batch) || | ||
| + | </note> | ||
| + | |||
| + | |||
| + | * Run iotop (install it if you do not already have it) in a separate shell showing only processes or threads actually doing I/O. | ||
| + | * Inspect the script code ({{:ep:laboratoare:dummy.sh|dummy.sh}}) to see what it does. | ||
| + | * Monitor the behaviour of the system with iotop while running the script. | ||
| + | * Identify the PID and PPID of the process running the dummy script and kill the process using command line from another shell (sending SIGINT signal to both parent & child processes). | ||
| + | * Hint - [[https://superuser.com/questions/150117/how-to-get-parent-pid-of-a-given-process-in-gnu-linux-from-command-line|How to get parent PID of a given process in GNU/Linux from command line?]] | ||
| + | |||
| + | <solution -hidden> | ||
| + | {{:ep:laboratoare:lab3-ex4.png?600}} | ||
| + | |||
| + | **dd** performs disk writes... wow! Reason why there are no disk reads is because it uses pseudo-files from **devtmpfs** that don't record these statistics. Also, **tmpfs** are not disks :p | ||
| + | |||
| + | Find PPID from PID: ps -o ppid= -p PID | ||
| + | Send SIGINT signal: kill -SIGINT PID,PPID | ||
| + | </solution> | ||