8.2-PRERELEASE: live deadlock,
almost all processes in "pfault" state
lev at FreeBSD.org
Sat Jan 8 22:06:09 UTC 2011
You wrote 8 января 2011 г., 23:20:28:
>> >> And, if it is "classic deadlock" is here any "classical" solution to
>> >> it?
>> > Do not allocate during bio processing.
>> So, if GEOM need some cache, it needs pre-allocate it and implements
>> custom allocator over allocated chunk? :(
>> And what is "bio processing" in this context? geom_raid5 puts all
> bio processing == whole time needed to finish pageout. Pageout is
> often performed to clean the page to lower the page shortage.
> If pageout requires more free pages to finish during the shortage,
> then we get the deadlock.
Ok, and transmission mmap() files on geom_raid5, so when these pages
are paged out, and geom_raid5 asks for other pages, and there is no
free ones... I see. It seems, that M_NOWAIT flag should help, if
geom_raid5 could live with failed mallocs...
> Also, it seems that you allocate not only bios (small objects, not
> every request cause page allocation), but also the huge buffers, that
> require free pages each time.
Yes, in worst case RAID5 need a lot of additional memory to perform
simple write. If it is lone write (geom_raid5 waits some time for
writes in adjacent areas, but not forever), geom_raid5 need to read
(Number of disks - 1) x (size of write) bytes of data to re-calculate
checksum. And it need buffers for this data. Worst case for 5-disks
RAID5 and 128KiB write will be 4x128KiB = 512KiB of buffers. For one
128KiB write. And I don;t understand how to avoid deadlock here :(
Maybe, preallocating some memory at start (these 512KiB) and try to
use them when malloc() failed...
I need to look how raid3 and vinum/raid5 lives with that situation.
// Black Lion AKA Lev Serebryakov <lev at FreeBSD.org>
More information about the freebsd-stable