[libvirt] blkio cgroup

Vivek Goyal vgoyal at redhat.com
Tue Feb 22 15:24:26 UTC 2011


On Tue, Feb 22, 2011 at 02:29:31PM +0100, Dominik Klein wrote:
> Hi
> 
> to be as verbose and clear as possible, I will write every command I use.

Thanks Dominik for detailed explanation and tests.

> 
> This sets everything up for the test:
> 
> # setup start
> 
> importantvms="kernel1 kernel2"
> notimportantvms="kernel3 kernel4 kernel5 kernel6 kernel7 kernel8"
> 
> for vm in $importantvms $notimportantvms; do
> virsh domstate $vm|grep -q running || virsh start $vm;
> done
> 
> echo 1 > /sys/block/sdb/queue/iosched/group_isolation
> 
> mount -t cgroup -o blkio none /mnt
> cd /mnt
> mkdir important
> mkdir notimportant
> 
> for vm in $notimportantvms; do
> cd /proc/$(pgrep -f "qemu-kvm.*$vm")/task
> for task in *; do
> /bin/echo $task > /mnt/notimportant/tasks
> done
> done
> 
> for vm in $importantvms; do
> cd /proc/$(pgrep -f "qemu-kvm.*$vm")/task
> for task in *; do
> /bin/echo $task > /mnt/important/tasks
> done
> done
> 
> #ls -lH /dev/vdisks/kernel[3-8]
> #brw-rw---- 1 root root 254, 25 Feb 22 13:42 kernel3
> #brw-rw---- 1 root root 254, 26 Feb 22 13:42 kernel4
> #brw-rw---- 1 root root 254, 27 Feb 22 13:42 kernel5
> #brw-rw---- 1 root root 254, 28 Feb 22 13:42 kernel6
> #brw-rw---- 1 root root 254, 29 Feb 22 13:43 kernel7
> #brw-rw---- 1 root root 254, 30 Feb 22 13:43 kernel8
> 
> for i in $(seq 25 30); do
> /bin/echo 254:$i 10000000 >
> /mnt/notimportant/blkio.throttle.write_bps_device
> done
> 
> # setup complete
> 
> > Hm..., this sounds bad. If you have put a limit of ~10Mb/s then no
> > "bo" is bad. That would explain that why your box is not responding
> > and you need to do power reset.
> > 
> > - I am assuming that you have not put any throttling limits on root group.
> >   Is your system root also on /dev/sdb or on a separate disk altogether.
> 
> No throttling on root. Correct.
> 
> system root is on sda
> vms are on sdb
> 
> > - This sounds like a bug in throttling logic. To narrow it down can you
> >   start running "deadline" on end device. If it still happens, it is more
> >   or less in throttling layer.
> 
> cat /sys/block/sdb/queue/scheduler
> noop deadline [cfq]
> echo deadline > /sys/block/sdb/queue/scheduler
> cat /sys/block/sdb/queue/scheduler
> noop [deadline] cfq
> 
> This changes things:
> 
> vmstat before test (nothing going on):
>  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy
> id wa
>  1  0      0 130231696  17968  69424    0    0     0     0 16573 32834
> 0  0 100  0
> 
> vmstat during test while all 8 vms are writing (2 unthrottled, 6 at 10M):
>  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy
> id wa
>  2  9      0 126257984  17968  69424    0    0     8 164462 20114 36751
>  5  4 52 39
> 
> vmstat during test when only throttled vms are still dd'ing
>  2 21      0 124518928  17976  69424    0    0     0 63876 17410 33670
> 1  1 59 39
> 
> Load is 12-ish during the test and the results are as expected:
> Throttled VMs write with approx 10M, unthrottled get like 80 each, which
> sums up to about the 200M max capacity of the device for direct io.

Ok, so deadline works just fine and there are no hangs. So it sounds more
like CFQ issue.

> 
> > - We can also try to remove dm layers and just create partitions on 
> >   /dev/sdb and export as virtio disks to virtual machines and take
> >   dm layer out of picture and see if it still happens.
> 
> Did that. Also happens when scheduler is cfq. Also does not happen when
> scheduler is deadline. So it does not seem to be a dm issue.

Ok, so dm is not the culprit then.

> 
> > - In one of the mails you mentioned that with 1 virutal machine throttling
> >   READs and WRITEs is working for you. So it looks like 1 virtual machine
> >   does not hang but once you launch 8 virtual machines it hangs. Can we
> >   try increasing the number of vitual machines gragually and confirm that
> >   it happens only if some certain number of virtual machines are launched.
> 
> Back on cfq here.
> 
> 1 throttled vm: works, load ~4
> 2 throttled vms: works, load ~6
> 3 throttled vms: works, load ~9
> 4 throttled vms: works, load ~12
> 6 throttled vms: works, load ~20
> 
> The number of blocked threads increases with the number of vms dd'ing.
> 
> At the beginning of each test, the blocked threads number goes really
> high (4 vms 160, 6 vms 220), but then drops significantly and stays low.
> 
> So it seems that when only throttled vms are running, the problem does
> not occur.
> 
> 1 throttled + 1 unthrottled vm: works, load ~5
> 2 throttled + 1 unthrottled vm: boom
> 

That't interesting. I will try to run 2 throttled VMs and 1 Unthrottled
and see if I can hit the same situation.

> Constantly 144 blocked threads, bo=0, load increasing to 144. System
> needs power reset.
> 
> So, thinking about what I did in the initial setup, I re-tested without the
> 
> for vm in $importantvms; do
> cd /proc/$(pgrep -f "qemu-kvm.*$vm")/task
> for task in *; do
> /bin/echo $task > /mnt/important/tasks
> done
> done
> 
> since I don't do anything with that "important" cgroup (yet) anyway. It
> did not make a difference though.
> 
> > - Can you also paste me the rules you have put on important and non-important
> >   groups. Somehow I suspect that some of the rule has gone horribly bad
> >   in the sense that it is very low and effectively no virtual machine
> >   is making any progress.
> 
> See setup commands in the beginning of this email.
> 
> > - How long does it take to reach in this locked state where bo=0.
> 
> It goes there "instantly", right after the dd commands start.
> 
> > - you can also try to redirect blktrace output to blkparse and redirect
> >   it to standard output and see capture some output by copying pasting
> >   last messages.
> 
> I hope this is what you meant:
> 
> blktrace -d /dev/sdb -o - | blkparse -i -

Yes, that's what I meant. Few observations from this trace.

- After a while all the IO coming in seems to be sleeping on
  get_request(). "S" signifies that. That means some other threads have
  already consumed the available request descriptors and new threads 
  are being put to sleep and will be woken up when request descriptors are
  available. Not sure why that is happening here.

- CFQ was idling on a queue and idle timer fired and it scheduled another
  dispatch. After that there is no request dispatched at all. Something
  went wrong for sure.

  8,16   1        0    55.806298452     0  m   N cfq idle timer fired
  8,16   1	  0    55.806300924     0  m   N cfq3564 slice expired t=0
  8,16   1        0    55.806303380     0  m   N cfq3564 sl_used=2 disp=1 charge
=2 iops=0 sect=8
  8,16   1        0    55.806303770     0  m   N cfq3564 del_from_rr
  8,16   1        0    55.806304555     0  m   N cfq schedule dispatch

- Following seems odd

8,16   7      925    55.890489350  3768  Q  WS 3407925696 + 480 [qemu-kvm]
8,16   7      926    55.890494793  3768  S  WS 3407925696 + 480 [qemu-kvm]
8,16   1        1 1266874889.707163736     0  C   R 3390363000 + 48 [0]
8,16   1        0 1266874889.707181482     0  m   N cfq3273 complete rqnoidl 

Time in fourth column jumps from 55.x to 1266874889.X. Sounds like some
corruption.

- I don't see any throttling messages. They are prefixed by "throtl". So
  it seems all this IO is happening in root group. I believe it belongs
  to unthrottled VM. So to me it looks that system reached in bad shape
  even before throttled VMs were started.

- So it sounds more and more like a CFQ issue which happens in conjuction
  with throttling. I will try to reproduce it.

- Need little more info about how did you capture the blktrace. So you 
  started blktrace and then started dd in parallel in all the three
  VMs and immediately system freezes and these are the only logs we see
  on console?

Thanks
Vivek




More information about the libvir-list mailing list