44

Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

  • Upload
    yandex

  • View
    1.179

  • Download
    1

Embed Size (px)

DESCRIPTION

Узкие места (bottlenecks) — главное, что ограничивает производительность любой системы. Мы расскажем, как быстро находить «бутылочное горлышко», какие метрики хороши, а какие — непригодны для мониторинга производительности. Рассмотрим классификации метрик, методы и инструменты анализа производительности. Вы узнаете, как сделать так, чтобы сервис эффективно использовал производственные мощности.

Citation preview

Page 1: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность
Page 2: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

Бутылочное горлышко

Епихин Михаил, Яндекс

Page 3: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

Узкое место

Page 4: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

�4

От всех узких мест невозможно избавиться. Узкое место можно только расширить или перенести.

Page 5: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

Виды анализа

�5

Page 6: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

Анализ ресурсов

CPU

�6

Memory

Disk

Net

Socket 0

Socket 1

Thread 0 Thread 1

Thread 2 Thread 3

Thread 4 Thread 5

Thread 6 Thread 7

Page 7: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

Анализ ресурсов

CPU

�7

Memory

Disk

Net

Socket 0

Socket 1

Thread 0 Thread 1

Thread 2 Thread 3

Thread 4 Thread 5

Thread 6 Thread 7

usr% sys%

iowait%

softirq%

hirq%steal%

idle%

nice%

LA1LA5

LA15run_queue

L1 Cache hitL1 Cache miss

L2 Cache hitL2 Cache hit

voluntary cswnonvoluntary csw

interrupts

NUMA free cached

dirty

used minfltmajflt swapin

rrqm/s

writeback

wrqm/s

r/s w/s

avgrq-sz

avgqu-szawait

util%

swapouttcpi

tcpo

udpi

udpopcki pcko

errierro

drpi

drpo

bandwidth

RTT

interrupts

Page 8: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

USE Method

Utilization (Утилизация)

!

�8

Page 9: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

USE Method

Utilization (Утилизация)

Saturation (Насыщение)

�9

Page 10: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

USE Method

Utilization (Утилизация)

Saturation (Насыщение)

Errors (Ошибки)

�10

Page 11: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

USE Method: CPU

Utilization us%, sy%, io%, si%, st%, id%

Saturation run_queue

Errors —

�11

Page 12: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

USE Method: CPU & Cores

Cpu0 : 3.0%us, 0.3%sy, 0.0%ni, 3.0%id, 0.0%wa, 0.3%hi, 93.4%si!Cpu1 : 39.3%us, 13.5%sy, 0.0%ni, 45.9%id, 0.0%wa, 0.0%hi, 1.3%si!Cpu2 : 37.6%us, 14.2%sy, 0.0%ni, 46.2%id, 0.0%wa, 0.0%hi, 2.0%si!Cpu3 : 36.4%us, 14.2%sy, 0.0%ni, 48.0%id, 0.0%wa, 0.0%hi, 1.3%si!Cpu4 : 31.8%us, 13.6%sy, 0.0%ni, 52.6%id, 0.0%wa, 0.0%hi, 2.0%si!Cpu5 : 30.2%us, 12.0%sy, 0.0%ni, 56.1%id, 0.0%wa, 0.0%hi, 1.7%si!Cpu6 : 29.7%us, 14.2%sy, 0.0%ni, 54.1%id, 0.0%wa, 0.0%hi, 2.0%si!Cpu7 : 35.0%us, 13.2%sy, 0.0%ni, 50.5%id, 0.0%wa, 0.0%hi, 1.3%si

�12

Page 13: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

USE Method: CPU & Cores

Cpu0 : 3.0%us, 0.3%sy, 0.0%ni, 3.0%id, 0.0%wa, 0.3%hi, 93.4%si!Cpu1 : 39.3%us, 13.5%sy, 0.0%ni, 45.9%id, 0.0%wa, 0.0%hi, 1.3%si!Cpu2 : 37.6%us, 14.2%sy, 0.0%ni, 46.2%id, 0.0%wa, 0.0%hi, 2.0%si!Cpu3 : 36.4%us, 14.2%sy, 0.0%ni, 48.0%id, 0.0%wa, 0.0%hi, 1.3%si!Cpu4 : 31.8%us, 13.6%sy, 0.0%ni, 52.6%id, 0.0%wa, 0.0%hi, 2.0%si!Cpu5 : 30.2%us, 12.0%sy, 0.0%ni, 56.1%id, 0.0%wa, 0.0%hi, 1.7%si!Cpu6 : 29.7%us, 14.2%sy, 0.0%ni, 54.1%id, 0.0%wa, 0.0%hi, 2.0%si!Cpu7 : 35.0%us, 13.2%sy, 0.0%ni, 50.5%id, 0.0%wa, 0.0%hi, 1.3%si

�13

idle 50%

Page 14: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

USE Method: CPU & Cores

Cpu0 : 3.0%us, 0.3%sy, 0.0%ni, 3.0%id, 0.0%wa, 0.3%hi, 93.4%si!Cpu1 : 39.3%us, 13.5%sy, 0.0%ni, 45.9%id, 0.0%wa, 0.0%hi, 1.3%si!Cpu2 : 37.6%us, 14.2%sy, 0.0%ni, 46.2%id, 0.0%wa, 0.0%hi, 2.0%si!Cpu3 : 36.4%us, 14.2%sy, 0.0%ni, 48.0%id, 0.0%wa, 0.0%hi, 1.3%si!Cpu4 : 31.8%us, 13.6%sy, 0.0%ni, 52.6%id, 0.0%wa, 0.0%hi, 2.0%si!Cpu5 : 30.2%us, 12.0%sy, 0.0%ni, 56.1%id, 0.0%wa, 0.0%hi, 1.7%si!Cpu6 : 29.7%us, 14.2%sy, 0.0%ni, 54.1%id, 0.0%wa, 0.0%hi, 2.0%si!Cpu7 : 35.0%us, 13.2%sy, 0.0%ni, 50.5%id, 0.0%wa, 0.0%hi, 1.3%si

�14

bottleneck

Page 15: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

USE Method: CPU & Cores

~$ cat /proc/interrupts | tr -s ' ' | grep eth0-TxRx! 91: 2868134299 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-0! 92: 2868146311 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-1! 93: 2868133640 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-2! 94: 2868134872 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-3! 95: 2868144236 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-4! 96: 2868135354 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-5! 97: 2868134226 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-6! 98: 2868134787 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-7

�15

Page 16: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

USE Method: CPU & Cores

~$ cat /proc/interrupts | tr -s ' ' | grep eth0-TxRx! 91: 2868134299 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-0! 92: 2868146311 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-1! 93: 2868133640 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-2! 94: 2868134872 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-3! 95: 2868144236 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-4! 96: 2868135354 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-5! 97: 2868134226 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-6! 98: 2868134787 0 0 0 0 0 0 0 IR-PCI-MSI-edge eth0-TxRx-7

�16

Page 17: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

USE Method: Memory

Utilization free, used, cached

Saturation swapin, swapout, page fault

Errors malloc() errors

�17

Page 18: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

USE Method: Network

Utilization bandwidth, pcki, pcko

Saturation overruns, dropped

Errors retransmits

�18

Page 19: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

USE Method: Disk

Utilization bandwidth, util, r/s, w/s

Saturation iowait, await, avgqu-sz

Errors —

�19

Page 20: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

USE Method

Utilization (Утилизация)

Saturation (Насыщение)

Errors (Ошибки)

�20

Page 21: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

Resource: Lock

Utilization time_in_critical_section/s

Saturation queue_size

Errors ?

�21

Page 22: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

mongostat

1.1.1.1:27017 … db:13.0% 0 0|0 0|0 741k 657k 64 db PRI!

1.1.1.1:27017 … local:149.1% 0 0|0 10|0 336b 3k 3 db SEC

�22

bottleneck?

Page 23: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

mongostat

1.1.1.1:27017 … db:13.0% 0 0|0 0|0 741k 657k 64 db PRI!

1.1.1.1:27017 … local:149.1% 0 0|0 10|0 336b 3k 3 db SEC

�23

NO! QR/QW 0/0

Page 24: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

mongostat

1.1.1.1:27017 … db:13.0% 0 0|0 0|0 741k 657k 64 db PRI!

1.1.1.1:27017 … local:149.1% 0 0|0 10|0 336b 3k 3 db SEC

�24

AR/AW 10/0

Page 25: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

<твой> resourceThread Pool или Connection Pool

!

Utilization used_objects / pool_capacity

Saturation queue_size

Errors queue_overflow

�25

Page 26: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

Если в процессе есть узкое место, то большинство задач будут стоять перед ним.

�26

Page 27: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

Thread State Analysis

D uninterruptible sleep (usually IO)!

R running or runnable (on run queue)!

S interruptible sleep (waiting for an event to complete)!

! . . .

�27

Page 28: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

poor man’s profiler

gdb -ex "set pagination 0" -ex "thread apply all bt” \!

--batch -p $(pgrep process) > 1.td

�28

Page 29: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

TSA Method & GDB

~/research $ grep "#0" 1.td | sort | uniq -c!

2 #0 0x00007fa7298d2cd3 in epoll_wait ()!

17 #0 0x00007fa729b8843c in pthread_cond_wait ()!

13 #0 0x00007fa729b8b054 in __lll_lock_wait ()!

1 #0 0x00007fa729b8c2a5 in sigwait ()!

1 #0 bn_sqr4x_mont () at x86_64-mont.s:1227

�29

Page 30: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

TSA Method & GDB

~/research $ grep "#0" 1.td | sort | uniq -c | magic!

S 2 #0 0x00007fa7298d2cd3 in epoll_wait ()!

S 17 #0 0x00007fa729b8843c in pthread_cond_wait ()!

S 13 #0 0x00007fa729b8b054 in __lll_lock_wait ()!

S 1 #0 0x00007fa729b8c2a5 in sigwait ()!

R 1 #0 bn_sqr4x_mont () at x86_64-mont.s:1227

�30

Page 31: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

TSA Method & GDB

~/research $ grep "#0" 4.td | sort | uniq -c | magic!

S 1 #0 0x00007f51ce80cd3a in _int_free ()!

R 1 #0 0x00007f51ce81dba3 in memcpy ()!

S 7 #0 0x00007f51ce87ccd3 in epoll_wait ()!

S 17 #0 0x00007f51ceb3243c in pthread_cond_wait()!

S 1 #0 0x00007f51ceb35a2d in recvmsg ()!

S 1 #0 0x00007f51ceb362a5 in sigwait ()!

R 7 #0 bn_sqr4x_mont ()!

�31

Page 32: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

TSA Method & GDB

~/research $ grep "#0" 4.td | sort | uniq -c

S 1 #0 0x00007f51ce80cd3a in

R 1 #0 0x00007f51ce81dba3 in

S 7 #0 0x00007f51ce87ccd3 in epoll_wait ()

S 17 #0 0x00007f51ceb3243c in pthread_cond_wait()!

S 1 #0 0x00007f51ceb35a2d in

S 1 #0 0x00007f51ceb362a5 in sigwait ()

R 7 #0

�32

250 handshakes/s 3000 handshakes/sx12 throughput

Page 33: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

sed “s/Thread/entity/g”

CPU: usr%, sys%, sirq%, iowait%, …

Socket: ESTAB, TIME-WAIT, SYN-RECV, …

�33

straceperf blktrace

systemtap

Page 34: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

high sys time~ $ sudo strace -f -c -p $(pgrep process) | magic!

% time!seconds! usecs/call!calls! errors!syscall!

48.18! 0.005732! 2! ! 2560! 2560! connect!

15.03! 0.001788! 0! ! 5147! ! ! close!

10.02! 0.001192! 0! ! 7106! ! ! epoll_wait!

5.02! 0.000597! 0! ! 2575! ! ! write!

4.95! 0.000589! 0! ! 13447! ! ! epoll_ctl

�34

Page 35: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

high sys time~ $ sudo strace -f -c -p $(pgrep process) | magic!

% time!seconds! usecs/call!calls! errors!syscall!

48.18! 0.005732! 2! ! 2560! 2560! connect!

15.03! 0.001788! 0! ! 5147! ! ! close!

10.02! 0.001192! 0! ! 7106! ! ! epoll_wait!

5.02! 0.000597! 0! ! 2575! ! ! write!

4.95! 0.000589! 0! ! 13447! ! ! epoll_ctl

�35

Page 36: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

high sys time~ $ sudo strace -f -c -p $(pgrep process) | magic!

% time!seconds! usecs/call!calls! errors!syscall!

48.18! 0.005732! 2! ! 2560! 2560! connect!

15.03! 0.001788! 0! ! 5147! ! ! close!

10.02! 0.001192! 0! ! 7106! ! ! epoll_wait!

5.02! 0.000597! 0! ! 2575! ! ! write!

4.95! 0.000589! 0! ! 13447! ! ! epoll_ctl

�36

Page 37: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

socket statistics

schizophrenia@target:~$ ss -s!

TCP: 3 (estab 67, closed 123, orphaned 0, synrecv 45, timewait 60143/0), ports 0

�37

Page 38: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

socket statistics

schizophrenia@target:~$ ss -s!

TCP: 3 (estab 67, closed 123, orphaned 0, synrecv 45, timewait 60143/0), ports 0

�38

Page 39: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

socket statistics

schizophrenia@target:~$ ss -s!

TCP: 3 (estab 67, closed 123, orphaned 0, synrecv 45, timewait 60143/0), ports 0

�39

net.ipv4.tcp_tw_recycle = 0!net.ipv4.tcp_tw_reuse = 0

Page 40: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

Заключение

1. Управляйте ресурсами (USE Method)

!

!

�40

Page 41: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

Заключение

1. Управляйте ресурсами (USE Method)

2. Ищите узкие места (TSA Method)

!

�41

Page 42: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

Заключение

1. Управляйте ресурсами (USE Method)

2. Ищите узкие места (TSA Method)

3. Комбинируйте Workload & Resource

�42

Page 43: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

Заключение

1. Управляйте ресурсами (USE Method)

2. Ищите узкие места (TSA Method)

3. Комбинируйте Workload & Resource

4. Benchmark / Performance / Load testing

�43

Page 44: Михаил Епихин — Бутылочное горлышко. как найти узкие места сервиса и увеличить производительность

Спасибо! Вопросы?

Епихин Михаил

инженер по тестированию производительности

@SCH1Z0PHR3N1A

[email protected]

�44