DTrace
![]() Lista parametrów narzędzia DTrace | |
Autor | Bryan Cantrill, Adam Leventhal, Mike Shapiro (Sun Microsystems) |
---|---|
Pierwsze wydanie | styczeń 2005 – 19 lat temu |
Język programowania | C |
System operacyjny | Solaris, illumos, macOS, FreeBSD, NetBSD, Linux[1], Windows[2] |
Rodzaj | tracing |
Licencja | CDDL, GPLv2, UPL |
Strona internetowa |
DTrace (Dynamic Tracing Framework) – zaawansowane narzędzie, pierwotnie opracowane przez firmę Sun Microsystems, służące do rozwiązywania problemów z jądrem i aplikacjami w czasie rzeczywistym. Napisane z myślą o systemie operacyjnym Solaris, zostało wydane na wolnej licencji Common Development and Distribution License (CDDL) w systemie OpenSolaris i jego następcy, illumos. Narzędzie przeportowano także na różne systemy uniksopodobne.
Za pomocą DTrace można uzyskać ogólne informacje o uruchomionym systemie, takie jak ilość pamięci, czas procesora, system plików i zasoby sieciowe wykorzystywane przez aktywne procesy. Może również dostarczyć bardziej szczegółowe dane, np. dziennik (log) argumentów, w których wywoływana jest określona funkcja czy lista procesów uzyskujących dostęp do określonego pliku.
W 2010 roku firma Oracle Corporation przejęła Sun Microsystems i ogłosiła zaniechanie wsparcia technicznego dla OpenSolaris. 3 sierpnia 2010 roku[3] w ramach konferencji internetowej dotyczącej konsolidacji OpenSolaris OS/Net zapowiedziano, opracowywany przez kluczowych programistów systemu Solaris, nowy system illumos, będący forkiem.
W październiku 2011 roku Oracle ogłosiło plany przeportowania DTrace do systemu Linux[4], a w 2019 roku na repozytorium GitHub pojawiła się oficjalna wersja dla dystrybucji Fedora. Przez lata na Linuksa dostępny był nieoficjalny port, bez zmian w licencjonowaniu[5].
W sierpniu 2017 r., Oracle wydało kod źródłowy jądra DTrace na licencji GNU General Public License v2+ oraz kod przestrzeni użytkownika (ang. user space), na warunkach licencji GPLv2 i Universal Permissive License (UPL)[6]. We wrześniu 2018 roku firma Microsoft ujawniła port narzędzia z FreeBSD na Windows.
We wrześniu 2016 na repozytorium GitHub pojawiła się strona dotycząca OpenDTrace, zawierająca kod źródłowy[7] i dokumentację[8] opisującą działanie. Prace nad OpenDTrace toczą się z użyciem porcji kodu pochodzącego z OpenSolaris pod oryginalną licencją CDDL, do których dołączono dodatkowy kod, objęty 2-klauzulową licencją BSD. Celem projektu OpenDTrace jest wydanie uniwersalnej, przenośnej implementacji DTrace, akceptowalnej dla wszystkich klientów, w tym m.in. macOS, FreeBSD, OpenBSD, NetBSD, Linux i systemów wbudowanych (ang. embedded systems).
Opis
Sun Microsystems zaprojektowało DTrace, aby dawało użytkownikom wgląd operacyjny umożliwiający dostrojenie i rozwiązywanie problemów zarówno z aplikacjami, jak i systemem operacyjnym.
Testerzy pisali programy śledzące (nazywane także skryptami) za pomocą języka D (nie mylić z innymi językami o tej samej nazwie). Język ten, inspirowany przez C, zawiera nowe funkcje oraz zmienne specyficzne do śledzenia. Struktura programów napisanych w D przypomina te napisane w awk; składają się z listy zawierającej jedną lub więcej próbników (wskaźników instrumentacji), gdzie każdy z próbników jest przypisany do konkretnej akcji. Próbniki można przyrównać do punktów przecięcia (ang. pointcut(inne języki)) w programowaniu aspektowym. W chwili, gdy spełnione są określone warunki dla próbnika, następuje wykonanie przypisanej akcji. Typowy próbnik może wykonać akcję przy otwarciu konkretnego pliku, uruchomieniu procesu czy wykonaniu określonej linii kodu. Działający próbnik może analizować w czasie wykonania, uzyskując dostęp do stosu wywołań (ang. call stack) i zmiennych kontekstowych oraz oceniać wyrażenia; następnie może przedstawić lub zapisać (w formie dziennika) część informacji, zachować je w bazie danych lub modyfikować zmienne kontekstowe. Odczyt i zapis zmiennych kontekstowych umożliwia próbnikom wzajemne przekazanie informacji, co pozwala na kooperacyjną analizę korelacji między różnymi zdarzeniami.
Wdrożono specjalne rozwiązania mające uczynić DTrace bezpiecznym narzędziem w „środowisku produkcyjnym”. Przykładowo, w trakcie procesu śledzenia występuje minimalny efekt próbnika(inne języki), a jakikolwiek wyłączony próbnik nie ma wpływu na wydajność; jest to szczególnie ważne, ponieważ w DTrace można uruchomić nawet dziesiątki tysięcy próbników. Nowe próbniki mogą również powstawać dynamicznie.
Przykłady linii poleceń
Skrypty DTrace mogą zostać załadowane bezpośrednio z linii poleceń, dostarczając jeden lub więcej próbników i akcji jako argumenty. Poniżej znajduje się kilka przykładowych wywołań:
# Nowe procesy z argumentami dtrace -n 'proc:::exec-success { trace(curpsinfo->pr_psargs); }' # Pliki otwarte przez proces dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }' # Licznik wywołań systemowych według programu dtrace -n 'syscall:::entry { @num[execname] = count(); }' # Licznik wywołań systemowych według funkcji wywołań systemowych dtrace -n 'syscall:::entry { @num[probefunc] = count(); }' # Licznik wywołań systemowych według procesu dtrace -n 'syscall:::entry { @num[pid,execname] = count(); }' # Rozmiar dysku według procesu dtrace -n 'io:::start { printf("%d %s %d",pid,execname,args[0]->b_bcount); }' # Liczba zapisanych stron pamięci według procesu dtrace -n 'vminfo:::pgpgin { @pg[execname] = sum(arg0); }'
Ręcznie tworzone skrypty mogą osiągnąć nawet setki linii długości, aczkolwiek przeważnie do zaawansowanej analizy i rozwiązywania problemu wystarczające są mające kilkadziesiąt linii. W zestawie DTraceToolkit[9], stworzonym przez Brendana Gregga (autora książki o DTrace[10]) można odnaleźć ponad 200 przykładowych skryptów open source z dokumentacją i demonstracją każdego z nich.
Obsługiwane platformy
DTrace po raz pierwszy stało się dostępne do użycia w listopadzie 2003 roku, a formalnie wydano je w styczniu 2005 roku jako część systemu Solaris 10. DTrace był pierwszym komponentem projektu OpenSolaris, którego kod źródłowy opublikowano na licencji CDDL.
DTrace jest integralną częścią illumos i pokrewnych dystrybucji.
DTrace jest standardowym elementem FreeBSD[11]i NetBSD[12].
Apple dodało wsparcie dla DTrace w Mac OS X 10.5 „Leopard”, dołączając graficzny interfejs użytkownika (GUI) o nazwie Instruments[13]. W folderze /usr/bin[14] występuje ponad 40 skryptów DTrace, zawierających narzędzia do badania wejścia-wyjścia (I/O) dysku (iosnoop) oraz uruchamiania procesów (execsnoop). W przeciwieństwie do innych platform wspierających DTrace, Mac OS X posiada flagę (P_LNOATTACH) ustawianą przez program, a która blokuje śledzenie przez narzędzia takie jak DTrace czy GNU Debugger. W oryginalnej implementacji DTrace na Mac OS X flaga ta może wpłynąć na śledzenie innych informacji o systemie, takich jak w sytuacji gdy niepowiązany próbnik spróbuje uruchomić program mający włączoną flagę, to próba zakończy się niepowodzeniem[15]. Aktualizacja OS X 10.5.3 wydana kilka miesięcy później wyeliminowała ten problem[16]. Jednakże, od wersji El Captain, mechanizm System Integrity Protection(inne języki) domyślnie blokuje śledzenie chronionych plików binarnych przez DTrace.
Port DTrace na Linuksa dostępny jest od 2008 roku[17]; wciąż trwają prace nad ulepszeniem i naprawą usterek. Na repozytorium GitHub dostępna jest także działająca implementacja[18]. Dostępni są standardowi dostarczyciele jądra (fbt, syscall, profile) oraz specjalny instr (według stanu z 2013 roku niektórzy z dostarczycieli w Solarisie nie byli jeszcze dostępni). Inplementacja DTrace w Linuksie jest ładowalnym modułem jądra – oznacza to, że jądro samo w sobie nie wymaga modyfikacji, co umożliwia DTrace uniknąć konfliktów licencji CDDL i GPL (przynajmniej w kontekście kodu źródłowego). Jednak, po wczytaniu DTrace, instancja jądra będzie traktowana jako „skażona”.
W 2007 roku programista z QNX Software Systems opublikował na swoim blogu wpis, w którym opisał, że razem z kolegą pracował nad przyłączeniem DTrace do systemu operacyjnego QNX[19].
W 2011 roku[1] Oracle Corporation dodało wsparcie dla DTrace w Oracle Linux w formie beta, jako próbkę technologiczną w wydaniu drugim Unbreakable Enterprise Kernel, na licencji GPLv2 (moduł jądra DTrace Linux wydano pierwotnie na licencji CDDL)[20]. W grudniu 2012 roku zapowiedziano wydanie ogólnodostępne[21][22].
11 marca 2019 roku firma Microsoft wydała swoją kompilację DTrace dla systemu Windows 10 w wydaniu Insider[23].
Dostawcy języka i aplikacji
Przy wspieranym dostawcy języka, DTrace może wydobyć kontekst z kodu źródłowego, włączając w to funkcję, plik źródłowy oraz położenie (numer) konkretnej linii kodu. Co więcej, dynamiczna alokacja pamięci oraz jej odśmiecanie mogą być dostępne, jeżeli są obsługiwane przez dany język. Do obsługiwanych dostawców języka należą asemblery, C, C++, Java, Erlang, JavaScript, Perl, PHP, Python, Ruby, skrypt powłoki(inne języki) i Tcl.
Dostawcy aplikacji pozwalają DTrace podążać za działaniem aplikacji poprzez wywołania systemowe oraz do jądra. Aplikacjami oferującymi dostawców aplikacji dla DTrace są m.in. MySQL, PostgreSQL, Oracle Database, Oracle Grid Engine(inne języki) oraz Firefox[24][25][26].
Autorzy i nagrody
DTrace został zaprojektowany i zaimplementowany przez Bryana Cantrilla, Mike’a Shapiro i Adama Leventhala.
Autorzy otrzymali w 2005 roku uznanie od InfoWorld(inne języki)[27] i Technology Review(inne języki)[28] za innowacje w DTrace. DTrace zajęło pierwsze miejsce w konkursie Technology Innovation Awards, zorganizowanym przez The Wall Street Journal w 2006 roku[29]. Autorzy zostali wyróżnieni przez USENIX nagrodą Software Tools User Group (STUG) w 2008 roku[30].
Bibliografia
- Bryan Cantrill. Hidden in Plain Sight. „ACM Queue(inne języki)”. 4 (1), s. 26–36, luty 2006. DOI: 10.1145/1117389.1117401. [dostęp 2017-12-19]. (ang.).
- Bryan M.B.M. Cantrill Bryan M.B.M., Michael W.M.W. Shapiro Michael W.M.W., Adam H.A.H. Leventhal Adam H.A.H., Dynamic Instrumentation of Production Systems, [w:] Proceedings of the 2004 USENIX Annual Technical Conference [online], czerwiec 2004 [dostęp 2022-01-11] (ang.).
Przypisy
- ↑ a b Wim Coekaerts: Trying out dtrace. blogs.oracle.com, 2011-10-09. [dostęp 2022-01-11]. (ang.).
- ↑ DTrace on Windows. Microsoft Docs, 2021-12-15. [dostęp 2022-01-11]. (ang.).
- ↑ GarrettG. D'Amore GarrettG., Illumos – Hope and Light Springs Anew – Presented by Garrett D'Amore [PDF] [online], illumos.org, 3 sierpnia 2010 (ang.).
- ↑ Oracle To Bring Dtrace To Linux. Slashdot, 2011-10-04. [dostęp 2022-01-11]. (ang.).
- ↑
- ↑ Mark J.M.J. Wielaard Mark J.M.J., dtrace for linux; Oracle does the right thing, 14 lutego 2018 [zarchiwizowane 2021-04-19] (ang.).
- ↑ Open DTrace. GitHub. [dostęp 2022-01-11]. (ang.).
- ↑ opendtrace / documentation. GitHub. [dostęp 2022-01-11]. (ang.).
- ↑ Brendan Gregg: DTraceToolkit. [dostęp 2022-01-11]. (ang.).
- ↑ DTrace: Dynamic Tracing in Oracle Solaris, Mac OS X and FreeBSD. Safari Books, 2011. ISBN 0-13-209151-8. [dostęp 2022-01-11]. (ang.).
- ↑ FreeBSD 7.1-RELEASE Announcement. FreeBSD.org, 2009-01-04. [dostęp 2022-01-11]. (ang.).
- ↑ NetBSD source changes. 2010-02-21. [dostęp 2022-01-11]. (ang.).
- ↑ AppleA. Inc. AppleA., Mac OS X Leopard – Developer Tools – Instruments [zarchiwizowane 2007-10-24] (ang.).
- ↑ Apple Inc: Mac OS X DTrace – Source Browser. [dostęp 2022-01-11]. (ang.).
- ↑ Adam Leventhal: Mac OS X and the missing probrs. Adam Leventhal's blog, 2008-01-18. [dostęp 2022-01-11]. (ang.).
- ↑ Adam Leventhal: Apple updates DTrace. Adam Leventhal's blog, 2008-06-07. [dostęp 2022-01-11]. (ang.).
- ↑ CRiSP tools download page [zarchiwizowane 2012-12-23] (ang.).
- ↑ dtrace4linux. GitHub. [dostęp 2022-01-11]. (ang.).
- ↑ c, DTrace on QNX!, The Observation Deck. Views on software from Bryan Cantrill's deck chair., 8 listopada 2007 [zarchiwizowane 2013-01-31] (ang.).
- ↑ ElenaE. Zannoni ElenaE., Kris VanK.V. Hees Kris VanK.V., DTrace on Linux [PDF], Linux Foundation Collaboration Summit, 2012 [zarchiwizowane 2014-07-07] (ang.).
- ↑ ZeynepZ. Koch ZeynepZ., Announcement: DTrace for Oracle Linux General Availability, Oracle Linux Blog, 12 grudnia 2012 [zarchiwizowane 2020-08-03] (ang.).
- ↑ Linux DTrace modules, oss.oracle.com [zarchiwizowane 2015-04-18] (ang.).
- ↑ Hari Pulapaka: DTrace on Windows. Microsoft Tech Community, 2019-03-11. [dostęp 2022-01-11]. (ang.).
- ↑ DTrace: Dynamic Tracing in Oracle Solaris, Mac OS X and FreeBSD. Prentice Hall, 2011, s. 1152. ISBN 978-0-13-209151-0. (ang.).
- ↑ Open Grid Scheduler / Grid Engine Documentation. Open Grid Scheduler. [dostęp 2022-01-11]. (ang.).
- ↑ DTrace, Mozilla Developer Network [zarchiwizowane 2013-11-07] (ang.).
- ↑ Innovation is alive and well in 2005, InfoWorld [zarchiwizowane 2005-11-23] (ang.).
- ↑ MIT, Tracing software in real time, Technology Review, 2005 [zarchiwizowane 2012-02-11] (ang.).
- ↑ Michael Totty: The Winners Are.... The Wall Street Journal, 2006-09-11. [dostęp 2022-01-11]. (ang.).
- ↑ USENIX Awards Presented at USENIX '08. USENIX, 2008. (ang.).
Linki zewnętrzne
- DTrace Tools – przykłady DTrace autorstwa Brendana Gregga (2004) (ang.)
- FreeBSD DTrace page – strona domowa DTrace FreeBSD, zawierająca przewodnik i przykłady (ang.)
- DTrace book – zawiera setki przykładowych skryptów (ang.)
- DTrace guide – przewodnik po DTrace w illumos (ang.)
- Dynamic Tracing with DTrace & SystemTap – darmowa książka z przykładami i ćwiczeniami (ang.)
- DTrace book scripts – skrypty z książki o DTrace na repozytorium GitHub
- DTraceToolkit – kolekcja skryptów DTrace na stronie Brendana Gregga (ang.)
- DTrace Hands On Lab – przewodnik krok po kroku w nauce użytkowania DTrace (ang.)
- DLight Tutorial – interaktywne narzędzie GUI dla programistów w C/C++ bazujące na technologii DTrace; część Oracle Solaris Studio do wersji 12.4 (ang.)
- Exploring Leopard with DTrace. mactech.com. [zarchiwizowane z tego adresu (2017-09-03)]. – DTrace na potrzeby debugowania i eksploracji (ang.)
- Tech Talk on DTrace given by Bryan Cantrill – zasób w serwisie YouTube
- Hidden in Plain Sight, Sun Microsystems, autorstwa Bryana Cantrilla – opis sposobów diagnozowania problemów wydajności oraz m.in. DTrace (ang.)
- dtrace.org – strona programu, zawierająca blogi twórców programu dotyczące DTrace (ang.)
- Oficjalny port DTrace na Linuksa:
- DTrace patches merged with recent Linux kernel releases (ang.)
- Userspace portion of the DTrace port to Linux
- Compact Type Format library used by DTrace on Linux
- DTrace na Fedorze (ang.)