This shows you the differences between two versions of the page.
ep:labs:05:contents:tasks:ex2 [2019/10/27 17:10] emilian.radoi created |
ep:labs:05:contents:tasks:ex2 [2025/02/11 23:43] (current) cezar.craciunoiu created |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 02. [30p] Gnuplot bar graphs ==== | + | ==== 02. [30p] iostat & iotop ==== |
- | Use Gnuplot and the data from {{:ep:labs:ep_lab5_autodata.txt|autoData.txt}} to generate separate **bar** graphs for the following: | + | === [15p] Task A - Monitoring the behaviour with Iostat === |
- | * The "//MidPrice//" of all the "//small//" cars. | + | <note tip> |
- | * The average fuel consumption (MPG - miles per gallon) for all the "//large//" cars. | + | Parameteres for iostat: |
- | * The "//MaxPrice//" over the average fuel consumption for all "//chevrolet//" and "//ford//" cars. | + | * -x for extended statistics |
+ | * -d to display device stastistics only | ||
+ | * -m for displaying r/w in MB/s | ||
+ | <code bash> | ||
+ | $ iostat -xdm | ||
+ | </code> | ||
+ | Use iostat with -p for specific device statistics: | ||
+ | <code bash> | ||
+ | $ iostat -xdm -p sda | ||
+ | </code> | ||
+ | </note> | ||
- | The graphs should be as complete as possible (title, axes names, etc.) | + | * 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**? | ||
- | <note tip> | + | 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. |
- | **Hint:** Gnuplot conditional plotting. | + | |
+ | <note> | ||
+ | How to do: | ||
+ | |||
+ | * 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> | </note> | ||
+ | |||
<solution -hidden> | <solution -hidden> | ||
- | <code> | + | 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. |
- | with boxes - pentru bar chart (set style fill solid - sa fie pline) | + | Example: the amount of data written per I/O for ///dev/sda// increases during each iteration: |
- | reset | + | {{ :ep:labs:ep2017_l3_ex01.png?700 |}} |
- | set size 1, 1 | + | <code> |
- | set multiplot layout 2,2 rowsfirst | + | 53040/105 = 505KB per I/O |
+ | 71152/102 = 697KB per I/O | ||
+ | </code> | ||
- | set title 'Graph Small Cars' | + | If everything is zero in iostat - perform some I/O operations... |
- | set xlabel 'Car' | + | </solution> |
- | set ylabel 'MidPrice' | + | |
- | unset key | + | |
- | plot "data5.txt" using (strcol(4) eq "small" ? $6 : 0) w l lw 0.5 lc rgb 'red' | + | |
- | set title 'Graph Fuel Consumption' | ||
- | set xlabel 'Car' | ||
- | set ylabel 'Fuel' | ||
- | unset key | ||
- | plot "data5.txt" using (strcol(4) eq "large" ? ($8 + $9)/2 : 0) w l lw 0.5 lc rgb 'blue' | ||
- | set title 'Graph Avg' | + | === [15p] Task B - Monitoring the behaviour with Iotop === |
- | set xlabel 'X' | + | <note tip> |
- | set ylabel 'Y' | + | **Iotop** is an utility similar to top command, that interfaces with the kernel to provide per-thread/process I/O usage statistics. |
- | unset key | + | |
- | plot "data5.txt" using (strcol(2) eq 'chevrolet' || strcol(2) eq "ford" ? $7 : 0) w l lw 0.5 lc rgb 'green', \ | + | <code> |
- | "data5.txt" using (strcol(2) eq 'chevrolet' || strcol(2) eq "ford" ? ($8 + $9)/2 : 0) w l lw 0.5 lc rgb 'orange' | + | Debian/Ubuntu Linux install iotop |
+ | $ sudo apt-get install iotop | ||
- | unset multiplot | + | How to use iotop command |
+ | $ sudo iotop OR $ iotop | ||
</code> | </code> | ||
- | </solution> | ||
+ | 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?]] | ||
+ | |||
+ | Provide a screenshot in which it shows the iotop with only the active processes and one of them being the running script. Then another screenshot after you succeeded to kill it. | ||
+ | |||
+ | <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> |