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/ blkparsejest 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 ftracebardzo 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 WCHANdane 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ż iostatprzeglądanie zawartości /sys/block/$DEVICE/statw bardzo krótkich odstępach czasu, po prostu tak:
while :; do cat /sys/block/sda/stat; sleep .1; done
Zobacz Documentation/iostats.txtw drzewie źródeł jądra format statpliku. 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.