FastNetMon

Friday 11 December 2009

Оценка нагрузки на диск от контейнеров OpenVZ

Сейчас столкнулись с такой ситуацией, когда wa / iowait достигал огромных значений, но источник нагрузки на диск найти не удавалось ни средствами dstat (--top-bio), ни подручными средствами. В итоге пришлось применять сертифицированные гуманитарные методы вычисления грузящего клиента, основанные на социальной инженерии. Но его, как и все не технические методы, его нельзя заскриптовать, что не особо радует в условиях больших инсталляций.

Но все же решение было найдено! Вот оно: http://wiki.openvz.org/IO_accounting. Но не все так просто по причине отсутствия документации (а точнее она указана ссылками на маны, что не очень удобно) по всем флагам.

Итого, путем поиском в /proc/bc и изучения wiki были найдены следующие потаенные места:



cat /proc/bc/$VEID/ioprio_queues
sdb 0 5024



По ioprio_queues нашел единственное упоминание в сети:

UBC cfq bc wait statistics Summarize per (bc, device) pair delays between bc enqueue
and activation. show in /proc/bc//ioprio_queues total wait time in milliseconds.


# cat /proc/bc/$VEID/ioacct
read 2138112
write 307200
dirty 6193152
cancel 5885952
missed 0

syncs_total 0
fsyncs_total 0
fdatasyncs_total 0
range_syncs_total 0
syncs_active 0
fsyncs_active 0
fdatasyncs_active 0
range_syncs_active 0
vfs_reads 57467
vfs_read_chars 21386727
vfs_writes 4126
vfs_write_chars 6063558
io_pbs 0


Параметры: read, write, dirty, cancel, missed описаны вот здесь, а на остальные там же даны ссылки на маны.

Более подробно:
http://wiki.openvz.org/IO_accounting

А для поиска самого грузящего клиента можно использовать вот такой скрипт (просто меняете write на требуемый вам параметр сортировки ):

perl -e 'my$param="write"; my %acct; my @ves=`vzlist | grep -v CTID`; map{$_ = (/(\d+)/)[0]} @ves; do { open my$z,"/proc/bc/$_/ioacct" or die "$!"; my@a=<$z>; use Data::Dumper; my %hs = map {s/^\s+//;s/\s+$//; split/\s+/,$_,2} @a; $acct{$_}=\%hs } for @ves; print $_, "\t$param: $acct{$_}->{$param}\n" for sort { $acct{$a}->{$param} <=> $acct{$b}->{$param} } keys %acct;'

2 comments :

  1. A ne koroce tak:

    for i in `vzlist -1`; do echo $i `cat /proc/bc/$i/ioacct |grep write`;done|sort -rn -k3|head -n20

    ReplyDelete
  2. Все варианты допустимы)

    ReplyDelete

Note: only a member of this blog may post a comment.