[LPIC-2] Measure and Troubleshoot Resource Usage (200.1)

Този урок покрива нужния матерал за изпит 1 от LPI-2 сертификацията, това включва следните нужни команди, файлове и термини:
1.iostat
2.iotop
3.vmstat
4.netstat
5.ss
6.iptraf
7.ps
8.pstree
9.w
10.lsof
11.free
12.top
13.htop
14.uptime
15.sar

Следните термини са нужни и се срещат в няколко от командите:
-processes blocked on I/O
-blocks out
-swap
-blocks in
Повече информация относно точка 200.1 може да намерите в официалния сайт на LPI

*Важно* В зависимост от вашата линукс дистрибуция и версия може да е нужно да инсталирате допълнителни пакети (например sysstat за Debian) за да използвате команди като iostat, sar и mpstat. Debian пакета procps съдържа останалата част от нужните пакети като free, uptime, vmstat, w и sysctl.

1.iostat
Командата iostat се използва за мониторинг на I/O(input/output) натоварването на системните устройства. Натоварването се изчислява като се вземе времето, през което устройството е било активно, заедно със средната скорост на трансфер. Изпълнена без допълнителни параметри опцията показва статистиките от последния системен рестарт.

boyanweb@boyanweb:~$ iostat
Linux 4.15.0-36-generic (boyanweb) 11/03/2018 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.05 0.01 0.04 0.17 0.00 99.73

Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
loop0 0.00 0.00 0.00 1006 0
loop1 0.00 0.00 0.00 822 0
sda 0.04 1.84 1.51 5034253 4130856 //hard disk
sdc 1.15 29.29 9.75 80338179 26747906 //hard disk with RAID 1
sdd 1.13 32.16 9.75 88208359 26747906 //hard disk with RAID 1
sdb 0.00 0.04 0.11 117042 313600 //hard disk
md0 1.21 4.50 9.67 12348082 26527840 //RAID 1
loop8 0.00 0.00 0.00 10117 0
loop9 0.00 0.00 0.00 152 0
loop10 0.00 0.00 0.00 12 0

Изпълнявайки командата с -c параметъра ние може да видим резултата само за процесора

boyanweb@boyanweb:~$ iostat -c
Linux 4.15.0-36-generic (boyanweb) 11/03/2018 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
___________0.05____0.01 ____0.04____0.17____0.00____99.73

2.iotop
Командата iotop е подобна на добре познатата ни top команда. Показава информация за I/O използваемостта от Линукс ядрото и показва таблица с текущите I/O процеси или нишки. Също показва I/O скоростта на запис и четене, приоритета както и времето прекарано в чакане от процеса. Общия I/O bandwith на четене/запис докато е пусната програмата също е показан. iotop изисква root права.

$ iotop -b |head
Total DISK READ : 0.00 B/s | Total DISK WRITE : 213.38 M/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
6 be/4 root 0.00 B/s 0.00 B/s 0.00 % 99.99 % [kworker/u8:0]
191 be/3 root 0.00 B/s 0.00 B/s 0.00 % 94.14 % [jbd2/sda1-8]
2976 be/4 root 0.00 B/s 213.38 M/s 0.00 % 0.00 % dd if=/dev/zero of=/tmp/foo
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
5 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0H]

3.vmstat
Командата vmstat ни дава статистики за виртуалната памет, процесите, паметта, блок I/О и CPU оползотворяването.

Използва се по следния начин:

vmstat [options] [delay [count]]

Примерен output от командата:

boyanweb@boyanweb:~$ vmstat 2 2
procs ———–memory———- —swap– —–io—- -system– ——cpu—–
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 780 2124484 421324 3143220 0 0 3 6 3 4 0 0 100 0 0
0 0 780 2124224 421324 3143220 0 0 0 37 163 262 0 0 99 0 0

Командата се чете: през 2 секунди изкарвай резултата, 2 пъти.
procs:
-Първата колона , “r”, показва броя на процесите, които в момента са алокирани на processorrun опашката. Това са процеси, които чакат т.нр CPU time.
-Втората колона , “b”, показва броя на процесите, които в момента са алокирани на block опашката. Това са процеси, които чакат устройство да върне I/O.

memory:
-Първата колона, “swpd”, показва колко виртуална памет се използва в момента (в килобайти). Под виртуална памет се разбира Swap паметта отделена от някой хард диск.
-Втората колоа, “free”, показва колко свободна RAM памет има в момента.
-Третата колона, “buff” показва колко RAM памет е заделена на бъфери.
-Четвъртата колона, “cache”, показва колко памет в момента е кеширана.
-Петата и шестата колона са съответно “inact” и “active” и се показват само при използването на -a параметъра.

swap:
-Първата колона, “si” показва колко памет се суапва от диска( за 1 секунда).
-Втората колона, “so”, показва колко памет се суапва към диска( за 1 секунда).
Съответно si-so -> Swap in-Swap out.

io:
-Първата колона, “bi”, показва броя на блокове/секунда, които се получават от блок устройство.
-Втората колона, “bo”, показва броя на блокове/секунда, които се изпращат към блок устройство.

system:
-Първата колона, “in”, показва броя на прекъсвания за секунда (включва и часовника).
-Втората колона, “cs”, показва броя на т.нр context switches за секунда.

cpu:
Колоните са изразени като % от общото CPU време.
-“us” – user code – Показва колко време е използвано за изпълнението на код, който не е от ядрото.
-“sy” – system code – Показва колко време е използвано за изпълнението на код, който е от ядрото.
-“id” – Колко време процесорът е бил idle.
-“wa” – Колко време процесорът е чакал за I/O/
-“st” – steal time – Процента от време “откраднат” от виртуалната машина. Това показва колко CPU време виртуалната машина е алокирала към други процеси, освен да поддържа виртуалната машина.

4.netstat
Командата netstat показва network връзките, routing tables, статистики за интерфейса и др.
Изпълнена без параметри показва всички активни сокети на всички конфигурирани адресни семейства. Някои от полезните опции са:
netstat -r (идентична на route -e) -> показва routing tables.
netstat -i -> Показва всички network интерфейси.
netstat -s -> Общи статистики за всеки протокол.

boyanweb@boyanweb:~$ netstat -r
Резултатът е примерен
Kernel IP routing table
Destination | Gateway | Genmask | Flags | MSS | Window | irtt | Iface
default _gateway 0.0.0.0 UG——–0 0 ——– 0 enp3s0
10.100.200.0 10.100.200.71 255.255.255.0 UG——–0 0 ——– 0 tun0
10.100.200.71 0.0.0.0 255.255.255.255 UH——–0 0 ——– 0 tun0
192.168.1.0 0.0.0.0 255.255.255.0 U ——–0 0 ——– 0 enp3s0
_gateway 0.0.0.0 255.255.255.255 UH——–0 0 ——– 0 enp3s0
192.168.3.0 10.100.200.71 255.255.255.0 UG——–0 0 ——– 0 tun0

boyanweb@boyanweb:~$ netstat –tcp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 96 boyanweb:ssh 192.168.1.3:59582 ESTABLISHED

5.ss
Командата ss се използва за преглед на сокет статистиките. Може да показва резултати за PACKET сокети, както и за TCP/UDP/DCCP/RAW/UNIX сокети. Показва информация подобна на тази от netstat, но с една идея по-подробно. Повечето линукс дистрибуции идват с преинсталиран ss пакет.

Използва се по следния начин:

$ ss [options] [filter]

Примерен резултат

$ ss -t -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 192.168.122.1:domain *:*
LISTEN 0 128 *:ssh *:*
LISTEN 0 128 127.0.0.1:ipp *:*
LISTEN 0 100 127.0.0.1:smtp *:*
ESTAB 0 48 192.168.1.9:ssh 192.168.1.3:59684

6.iptraf
iptraf е команда за network monitoring и следи натоварването на един IP network. Прихваща пакети от мрежата(в реално време) и дава полезна информация за тях.
Примерен резултат от iptraf-ng:

7.ps
Командата ps показва списък с текущите вървящи процеси. Това са същите процеси, които се показват от командата top.

За да видите всички процеси може да изпълните “ps -ef” или “ps -ax”. Процесите на отледен потребител могат да се видят с -u опцията

boyanweb@boyanweb:~$ ps -uboyanweb
PID TTY TIME CMD
6515 ? 00:00:00 sshd
6543 ? 00:00:00 sshd
6544 ? 00:00:00 sftp-server
6545 pts/0 00:00:00 bash
6548 ? 00:00:00 bash
6819 ? 00:00:00 sleep
6820 pts/0 00:00:00 ps

Чрез -p и подадено PID може да разберете името на процес и собственика му.

boyanweb@boyanweb:~$ ps -p6515
PID TTY TIME CMD
6515 ? 00:00:00 sshd

8.pstree
Командата pstree ще покаже резултат подобен на ps и top, но с резултат форматиран като дърво. Дървото има за корен подаден PID или init(1) по подразбиране, ако е зададено потребителско име с -u опцията, то pstree ще форматира резултата така че да се виждат само текущо вървящите процеси на дадения потребител. Програмата е полезна за намиране на parent process id(PPID) на който и да е процес. Цифра и процес заобграден от [] означава, че процеса съществува няколко пъти е групиран, за по-подреден output от командата.

screen───3*[bash]

sshd─┬─bash───pstree
└─bash───sleep

sshd───sftp-server

systemd───(sd-pam)

Чрез -p опцията ние може да изберем да видим PID на процесите.

boyanweb@boyanweb:~$ pstree -u boyanweb -p
screen(15301)─┬─bash(15302)
├─bash(15305)
└─bash(15341)

sshd(6515)─┬─bash(6545)───pstree(28263)
└─bash(6548)───sleep(28262)

sshd(6543)───sftp-server(6544)

systemd(14625)───(sd-pam)(14626)

Което лесно може да ни позволи да “убием” повтарящите се и ненужни процеси.

boyanweb@boyanweb:~$ kill -15 15301
boyanweb@boyanweb:~$ pstree -u boyanweb -p
sshd(6515)─┬─bash(6545)───pstree(28614)
└─bash(6548)───sleep(28613)

sshd(6543)───sftp-server(6544)

systemd(14625)───(sd-pam)(14626)

9.w
Командата w, подобно на името си, не е много “широка”. Показва ни текущите логиннати потребители, техния текущ процес(команда), както и резултата от uptime командата.

boyanweb@boyanweb:~$ w
21:40:21 up 35 days, 21:57, 1 user, load average: 0.04, 0.05, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
boyanweb pts/0 192.168.1.3 20:37 3.00s 0.06s 0.00s w

WHAT ни показва текущата команда, изпълнявана от потребителя – в текущия случай тя е “w”. Нека да проверим output-а от командата, когато имаме повече от един потребител.

boyanweb@boyanweb:~$ w
21:42:45 up 35 days, 21:59, 2 users, load average: 0.00, 0.02, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
boyanweb pts/0 192.168.1.3 20:37 1.00s 0.06s 0.00s w
boyanweb pts/1 192.168.1.3 21:42 5.00s 0.35s 0.31s find . / -name thisIsASecondUser

Виждаме и командата, изпълнявана от втория потребител.

10.lsof
Командата lsof изкарва информация за текущите отворени файлове и техните съответстващи процеси. На пръв поглед изведения резултат от командата може да ви изглежда малко нечетим, тук влиза в роля -F опцията. Тя форматира резултата по такъв начин, че да е използваем от програми и команди като C, Perl и awk.

boyanweb@boyanweb:/etc$ sudo lsof +d /var/log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
fail2ban- 1354 root 3w REG 259,0 557 1056766 /var/log/fail2ban.log
rsyslogd 11784 syslog 8w REG 259,0 719330 1053971 /var/log/syslog
rsyslogd 11784 syslog 9w REG 259,0 3837596 1054235 /var/log/ufw.log
rsyslogd 11784 syslog 10w REG 259,0 3838362 1059304 /var/log/kern.log
rsyslogd 11784 syslog 11w REG 259,0 185054 1059308 /var/log/auth.log
rsyslogd 11784 syslog 12w REG 259,0 15708 1058782 /var/log/mail.log

Тук “+d” опцията кара lsof да покаже всички отворени файлове/директории на най-високото ниво на /var/log/. Изпълнена без параметри lsof ще покаже всички отворени файлове принадлежащи на всички активни процеси.

11.free
Командата free Показва размера на RAM паметта(физическата и виртуалната), както и размера на свободната, кешираната и използваната памет.
Полето “shared” показва паметта използвана за tmpfs(/proc/meminfo). Опцията -h прави output-a по-четим.

boyanweb@boyanweb:/etc$ free
total used free shared buff/cache available
Mem: 6103632 401876 552600 3312 5149156 5396568
Swap: 12582908 780 12582128
boyanweb@boyanweb:/etc$ free -h
total used free shared buff/cache available
Mem: 5.8G 393M 538M 3.2M 4.9G 5.1G
Swap: 11G 780K 11G

12.top
Командата top е “динамична гледка на процесите в системата в реално време”

boyanweb@boyanweb:/etc$ top |head
top – 17:20:15 up 36 days, 17:36, 1 user, load average: 0.06, 0.03, 0.00
Tasks: 145 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.0 sy, 0.0 ni, 99.7 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 6103632 total, 548304 free, 404568 used, 5150760 buff/cache
KiB Swap: 12582908 total, 12582128 free, 780 used. 5393876 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24929 boyanweb 20 0 42816 4120 3428 R 6.2 0.1 0:00.01 top
1 root 20 0 225696 9688 6888 S 0.0 0.2 1:03.85 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.45 kthreadd

Тъй като top е интерактивна команда, подобно на други команди се излиза с “q”, а за помощ се натиска “?”. За навигация се използват следните клавишни комбинации:

key equivalent-key-combinations
Up alt + \ or alt + k
Down alt + / or alt + j
Left alt + or alt + l (lower case L)
PgUp alt + Up or alt + ctrl + k
PgDn alt + Down or alt + ctrl + j
Home alt + Left or alt + ctrl + h
End alt + Right or alt + ctrl + l

13.htop
Командата htop е подобна на топ, но позволява скроллване, което ви позволява да видите абсолютно всички процеси, разбира се идва и с допълнителни интерактивни опции, например: натискане на “k” за да се убие процес, без да е нужно да се пише PID.

14.uptime
uptime показва от колко време работи системата, както и средното натоварване на процесора за последните 1, 5 и 15 минути.

boyanweb@boyanweb:/etc$ uptime
18:33:20 up 36 days, 18:50, 1 user, load average: 0.02, 0.02, 0.00

15.sar
sar Събира, запаметява или докладва информация за системната дейност.
*Важно:*Ако не сте имали sar инсталиран и след инсталация програмата не работи e нужно да отворите /etc/default/sysstat с текстов редактор и да го зададете на enabled.След това sar ще започне да събира информация и ~час ще има “пълна” функционалност. През това време ще може да изпозлвате командата да следи системната дейност за X на брой пъти на всеки Y секунди.

Изпълнявайки само sar, без параметри, ще изведе output подобен на този:

Linux 4.15.0-36-generic (boyanweb) 11/10/2018 _x86_64_ (2 CPU)
14:28:42 LINUX RESTART (2 CPU)
14:28+10:42

Параметъра -d съобщава статистики за дисковете. Командата ще се изпълни два пъти, веднъж на всеки две секунди и след това ще даде среден резултат.

boyanweb@boyanweb:~$ sar -d 2 2
Linux 4.15.0-36-generic (boyanweb) 11/10/2018 _x86_64_ (2 CPU)

02:44:30 PM DEV tps rkB/s wkB/s areq-sz aqu-sz await svctm %util
02:44:32 PM dev7-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:44:32 PM dev7-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:44:32 PM dev7-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:44:32 PM dev8-32 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

02:44:32 PM DEV tps rkB/s wkB/s areq-sz aqu-sz await svctm %util
02:44:34 PM dev7-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:44:34 PM dev7-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:44:34 PM dev7-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:44:34 PM dev8-32 2.50 0.00 16.50 6.60 0.02 8.00 8.00 2.00

Average: DEV tps rkB/s wkB/s areq-sz aqu-sz await svctm %util
Average: dev7-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev7-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev7-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-32 1.25 0.00 8.25 6.60 0.01 8.00 8.00 1.00

Парметъра -b съобщава за статистики свързани с I/O и трансфер рейт-а(скоростта). Командата ще се изпълни 4 пъти, веднъж на всеки 2 секунди.

boyanweb@boyanweb:~$ sar -b 2 4
Linux 4.15.0-36-generic (boyanweb) 11/10/2018 _x86_64_ (2 CPU)

02:46:53 PM tps rtps wtps bread/s bwrtn/s
02:46:55 PM 0.00 0.00 0.00 0.00 0.00
02:46:57 PM 12.00 0.00 12.00 0.00 98.00
02:46:59 PM 0.00 0.00 0.00 0.00 0.00
02:47:01 PM 4.98 0.00 4.98 0.00 49.75
Average: 4.24 0.00 4.24 0.00 36.95

-c Показва system calls
-r Свободната RAM и swap памет.
Командата се изпълнява два пъти – веднъж на всяка минута.

boyanweb@boyanweb:~$ sar -r 60 2
Linux 4.15.0-36-generic (boyanweb) 11/10/2018 _x86_64_ (2 CPU)

02:49:30 PM kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
02:50:30 PM 205764 5394488 5897868 96.63 527044 4796604 2220272 11.88 3026616 2545224 20
02:51:30 PM 205764 5394528 5897868 96.63 527060 4796628 2219596 11.88 3026716 2545244 96
Average: 205764 5394508 5897868 96.63 527052 4796616 2219934 11.88 3026666 2545234 58

За по-лесно четим резултат може да се използва –human.

boyanweb@boyanweb:~$ sar -r –human 5 2
Linux 4.15.0-36-generic (boyanweb) 11/10/2018 _x86_64_ (2 CPU)

02:54:01 PM kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
02:54:06 PM 200.6M 5.1G 5.6G 96.6% 514.7M 4.6G 2.1G 11.9% 2.9G 2.4G 152.0k
02:54:11 PM 200.5M 5.1G 5.6G 96.6% 514.7M 4.6G 2.1G 11.9% 2.9G 2.4G 156.0k
Average: 200.5M 5.1G 5.6G 96.6% 514.7M 4.6G 2.1G 11.9% 2.9G 2.4G 154.0k

Автор:
Боян Атанасов