Teraz we właściwym czasie udało mi się rozwiązać ten problem, więc mogę przynajmniej sam się tym zająć dla potomności.
Niestety straciłem pierwotny problem z aktualizacją jądra, ale zamiast tego zyskałem nowy, jeszcze gorzej działający i równie trudny do wyśledzenia. Znalazłem następujące techniki:
Po pierwsze, blktrace
/ blkparse
jest narzędziem, które uważam za bardzo pomocne. Umożliwia śledzenie postępu poszczególnych żądań We / Wy z wieloma pomocnymi szczegółami, takimi jak proces, który przesłał żądanie. Pomocne jest włączenie danych wyjściowych tmpfs
, aby obsługa przechowywania śledzenia nie zaczęła się sama.
Pomogło to jednak tylko do tej pory, więc skompilowałem jądro z większą funkcjonalnością debugowania. W szczególności znalazłem ftrace
bardzo pomocne, ponieważ pozwoliło mi to prześledzić słabo działający proces w przestrzeni jądra, zobaczyć, co zrobił i gdzie został zablokowany. Kompilacja jądra debugowania zapewnia również działające WCHAN
dane wyjściowe ps
, co może działać jako łatwiejszy sposób na sprawdzenie, co robi proces w jądrze, przynajmniej w prostszych przypadkach.
Miałem również nadzieję, że LatencyTop będzie użyteczny, ale uznałem, że jest dość błędny, a także, że wyświetlał tylko przyczyny opóźnień, które były zbyt „na wysokim poziomie”, aby niestety były naprawdę użyteczne.
Uważam też, że jest to bardziej pomocne niż iostat
przeglądanie zawartości /sys/block/$DEVICE/stat
w bardzo krótkich odstępach czasu, po prostu tak:
while :; do cat /sys/block/sda/stat; sleep .1; done
Zobacz Documentation/iostats.txt
w drzewie źródeł jądra format stat
pliku. Oglądanie go w krótkich odstępach czasu pozwoliło mi zobaczyć dokładny czas i rozmiar serii wejść / wyjść i tym podobne rzeczy.
W końcu dowiedziałem się, że problem, który miałem po aktualizacji jądra, był spowodowany przez stabilne strony , funkcję wprowadzoną w Linuksie 3.0, powodującą, w moim przypadku, Berkeley DB zatrzymał się na dłuższy czas, gdy brudne strony zostały zmapowane pliki regionu. Chociaż wydaje się, że możliwe jest załatanie tej funkcji, a także to, że problemy, które ona powoduje, mogą zostać naprawione w Linuksie 3.9, rozwiązałem najgorszy problem, na jaki miałem teraz, łatając Berkeley DB, aby umożliwić mi umieszczenie plików regionu w innym katalogu (w moim przypadku /dev/shm
), co pozwala mi całkowicie uniknąć problemu.