This shows you the differences between two versions of the page.
ep:labs:03:contents:tasks:ex1 [2020/07/30 20:39] gheorghe.petre2608 [04. [20p] Monitor I/O with vmstat and iostat] |
ep:labs:03:contents:tasks:ex1 [2021/10/26 10:46] (current) radu.mantu [01. [10p] Rotational delay - IOPS calculations] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 04. [20p] Monitor I/O with vmstat and iostat ==== | + | ==== 01. [10p] Rotational delay - IOPS calculations ==== |
- | We said in the beginning that the disk I/O subsystems are the slowest part of any system. This is why the I/O monitoring is so important, maximizing the performance of the slowest part of a system resulting in an improvement of the performance of the entire system. | + | |
- | === [10p] Task A - Script === | + | <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: | ||
- | Write a script that reads the data into memory and generates a text file 500 times larger, by concatenating the contents of the following novel {{:ep:labs:olivertwist.txt|olivertwist.txt}} to itself. | + | * **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. |
- | + | * **Average latency**. The time it takes for the sector of the disk being accessed to rotate into position under a read/write head. | |
- | <solution -hidden> | + | * **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> | + | * **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). |
- | if __name__ == '__main__': | + | </note> |
- | text_file1 = open("OliverTwist.txt", "r") | + | 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: |
- | text_file2 = open("OliverTwistLarge.txt", "w+") | + | <code>average IOPS = 1 / (average latency in ms + average seek time in ms). |
- | lines_file1 = text_file1.readlines() | + | |
- | for x in range(0, 500): | + | |
- | text_file2.writelines(lines_file1) | + | |
</code> | </code> | ||
- | </solution> | ||
- | === [10p] Task B - Monitoring behaviour === | + | Let's calculate the Rotational Delay - RD for a 10K RPM drive: |
- | Now we want to analyze what is happening with the I/O subsystem during an expensive operation. Monitor the behavior of the system while running your script using **vmstat** and **iostat**. | + | * Divide 10000 RPM by 60 seconds: **''10000/60 = 166 RPS''** |
+ | * 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''** | ||
- | <note tip>vmstat - IO: | + | === [10p] Task A - Calculate rotational delay === |
- | bi - column reports the number of blocks received (or “blocks in”) from a disk per second. | + | Add in your archive the operations and the result you obtained. (Screenshot, picture of calculations made by hand on paper) |
+ | |||
+ | Calculate the Rotational Delay, and then the IOPS for a __5400 RPM drive__. | ||
+ | |||
+ | <solution -hidden> | ||
+ | As shown in the //"Calculating IOs Per Second"// section: | ||
+ | <code> | ||
+ | 5400 / 60 = 90 RPS | ||
+ | 1/90 = 0.011 seconds per Rotation | ||
+ | 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> | ||
+ | </solution> | ||
- | bo - column reports the number of blocks sent (“blocks out”) to a disk per second. | ||
- | </note> | ||