Czy w Linuksie można zobaczyć, ile żądań odczytu i zapisu z przestrzeni użytkownika powoduje trafienia do pamięci podręcznej i opuszcza urządzenia blokujące?
Możesz opracować własny skrypt SystemTap . Musisz uwzględnić następujące dwa podsystemy:
Opracowanie SystemTap zajmuje trochę czasu. Jeśli jesteś umiarkowanym programistą i masz dobrą wiedzę na temat Linuksa, powinieneś to zrobić za 3-4 dni. Tak, nauka zajmuje dużo czasu, ale będziesz bardzo zadowolony z rezultatów - SystemTap daje Ci możliwość (bezpiecznego) umieszczenia sond w prawie dowolnym miejscu jądra Linux.
Zauważ, że twoje jądro musi obsługiwać ładowanie i rozładowywanie modułów jądra. Większość obecnych jąder obsługuje to. Będziesz także musiał zainstalować symbole debugowania dla swojego jądra. W moim systemie Ubuntu było to tak proste, jak pobranie kilkuset MB pliku .deb, który skompilował dla mnie zespół programistów jądra Ubuntu. Jest to wyjaśnione na przykład na stronie Wiki SystemtapOnUbuntu .
PS Podejdź do SystemTap tylko wtedy, gdy nie masz innego rozwiązania, ponieważ jest to zupełnie nowa struktura, której musisz się nauczyć, a to kosztuje czas / pieniądze, a czasem frustrację.
Poszedłem naprzód i napisałem do tego scenariusz. Jest jedna na wiki systemtap, ale wydaje się, że nie jest poprawna. W podstawowych testach wydaje się to dość dokładne, ale YMMV.
źródło
semantic error: unable to find member 'bi_size' for struct bio (alternatives: bi_next bi_bdev bi_flags bi_rw bi_iter bi_phys_segments bi_seg_front_size bi_seg_back_size bi_remaining bi_end_io bi_private bi_ioc bi_css bi_integrity bi_vcnt bi_max_vecs bi_cnt bi_io_vec bi_pool bi_inline_vecs): operator '->' at /usr/share/systemtap/tapset/linux/ioblock.stp:113:20 source: size = $bio->bi_size ^ Pass 2: analysis failed. [man error::pass2]
czy możesz pomóc?/ proc / slabinfo to dobry początek, ale nie daje ci dość informacji, których szukasz (nie daj się zwieść procentom trafień / braków w systemach z włączoną wieloma rdzeniami i statystykami; to coś innego). O ile mi wiadomo, nie ma sposobu na wyciągnięcie tej konkretnej informacji z jądra, chociaż napisanie odrobiny kodu nie powinno być trudne.
Edycja: http://www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.5.html
źródło
Teraz jest narzędzie cachestat z pakietu perf-tools .
Autor wymienia także niektóre (prawdopodobnie bardziej brutalne) alternatywy, z których ludzie korzystają:
źródło
Jeśli interesuje Cię współczynnik trafień / chybień we / wy konkretnego procesu, prostym, ale bardzo skutecznym podejściem jest odczytanie
/proc/<pid>/io
pliku.Tutaj znajdziesz 4 kluczowe wartości:
rchar
: całkowita liczba odczytanych bajtów z punktu widzenia aplikacji (tj. bez różnicy między odczytem spełnionym z pamięci fizycznej, a nie z pamięci podręcznej)wchar
: jak wyżej, ale o bajtach zapisanychread_bytes
: bajty naprawdę odczytane z podsystemu pamięci masowejwrite_bytes
: bajty naprawdę zapisane w podsystemie pamięci masowejPowiedz, że proces ma następujące wartości:
Współczynnik pominięcia pamięci podręcznej odczytu (w bajtach) wynosi
100*200000/1000000 = 20%
, a współczynnik trafień wynosi100-20 = 80%
Istnieje jednak pewien haczyk:
rchar
wartość obejmuje coś jako tty IO, więc dla procesów, które dużo czytają / piszą z / do potoku, powyższe obliczenia zostaną wypaczone, zgłaszając wyższy współczynnik trafień niż efektywny.źródło