|
| Россия Worldwide |
|
DTrace как инструмент администратора SolarisПавел Анни Как часто приходится слышать фразы «система глючит», «почему-то тормозит», «не знаю, что происходит, проще перезагрузить»... Кому как, а мне становится очень неуютно, когда я не понимаю, что происходит. Тем более, если речь идет о системе, за которую я несу ответственность. Как найти причину проблем, заглянуть вглубь системы, понять, что происходит? Идея средства мониторинга, которое бы предоставляло бы возможность «заглянуть» в самые дальние уголки системы и позволяло бы получать ответы на самые неожиданные вопросы, давно зрела в умах разработчиков Solaris и наконец воплотилась в видео подсистемы динамической трассировки DTrace. Интересно отметить, что после официального объявления Solaris 10 в начале 2005 года разработчики Sun получили большое количество премий и наград за инновации, реализованные в этой операционной системе. Но одна награда действительно удивила Sun: в 2006 г. журнал Wall Street Journal (далекий, казалось бы от технических проблем) присудил «Золотую премию» за инновации именно технологии DTrace в Solaris 10 (http://www.dowjones.com/innovation/ei_winners_2006.html). При этом, серебряной и бронзовой премиями были отмечены технология тонкопленочных солнечных батарей и порошкообразный инсулин (который можно вдыхать вместо того, чтобы делать инъекции).
Введение в DTrace Исторически в UNIX (и Linux) сформировалась развитая система мониторинга и диагностики. Существует масса команд: все эти vmstat, mpstat, iostat, top и др. Они помогали и продолжают помогать системным администраторам решать повседневные задачи и искать ответы на вопросы: "насколько загружена система?", "что происходит с моими дисками?", "хватает ли виртуальной памяти?". В то же время, любой администратор не понаслышке знает и об ограничениях стандартных средств мониторинга и анализа. Скажем, посредством команды vmstat легко обнаружить, что система слишком много времени пребывает в состоянии system time (выполняя системные вызовы). С помощью strace (или ee эквивалента truss -- в Solaris) можно определить список этих вызовов. Но как понять, какая из системных функций вызывается наиболее часто и сколько времени тратится на ее выполнение? Как заглянуть «внутрь» системного вызова? Что происходит в ядре ОС, когда туда передается управление? В конце концов, в чем состоит причина «тормозов» при выполнении программы? Еще пример. С помощью утилиты iostat можно проанализировать состояние подсистемы дискового ввода-вывода и обнаружить, что один из дисков перегружен (большие очереди, большой поток данных). Какой из процессов стал тому причиной? Еще хуже, если вы видите, что кто-то (пользователь или программа) непрерывно пишет данные на диск, «съедая» дисковое пространство. Как понять, что это за процесс? Время идет, дисковое пространство кончается... Хорошо бы иметь под рукой набор утилит для решения такого рода проблем. Разработчики DTrace, Брайан Кэнтрил (Bryan Cantrill) и Майк Шапиро (Mike Shapiro) вспоминают, что когда-то, когда DTrace был еще только в идеях, они уже «пользовались» им в своих обсуждениях: «В этой ситуации мы введем такую команду с помощью DTrace и увидим, что...» Возможно, именно поэтому DTrace оказался настолько полезен для системных администраторов (более подробно история Dtrace изложена на http://research.sun.com/minds/2005-0929/). Немного теории Что можно увидеть с помощью DTrace? Если коротко – все. Подконтрольны все объекты, что существуют в системе, все системные вызовы, все устройства, интерфейсы и процессы. Все они снабжены так называемыми датчиками (probe), каждый из которых можно включить, выключить и опросить. Например, с помощью DTrace легко просмотреть:
Любой мало-мальски опытный системный администратор скажет, что все это можно увидеть и с помощью стандартных системных средств типа strace или truss. Появился другой набор задач -- администраторы Linux скажут: для этого есть iostat или mdb или vmstat. Но DTrace особенно хорош тем, что унифицирует все эти разрозненные, объединяет их в целостную и логичную систему, а кроме того предоставляет дополнительные возможности. Например, можно увидеть:
Безопасность DTrace
Когда речь заходит о DTrace, порой возникает вопрос о безопасности этой подсистемы. Очевидно, если хакер получит доступ к столь мощному инструменту, как DTrace -- страшно представить, что он может натворить. Поэтому еще на этапе проектирования были приняты необходимые меры предосторожности. В частности, исполнимый модуль DTrace может быть запущен только от имени суперпользователя root (или от пользователя, наделенного соответствующими полномочиями). По умолчанию DTrace запускается в режиме «только чтения» и никоим образом не может изменять состояние системы. Блокируются средства запуска и остановки процессов, отправки сигналов и вызова прерываний, записи в файл или канал. Это только инструмент мониторинга. Существует специальный ключ, который позволяет активировать упомянутые выше возможности, но системный администратор должен хорошо понимать, что он делает, прежде чем им воспользуется. (Какой это ключ? См. документацию!)
DTrace: практика Одна из важнейших возможностей DTrace – агрегация. Администратор системы может не только отслеживать запуск системных вызовов, но и просматривать статистические данные (сколько и каких вызовов было за определенный промежуток времени, сколько суммарно времени занимал каждый из вызовов и др.) и сортировать результаты. Таким образом легко выявляются программы, незаметно «съедающие» значительную часть системного времени. Если они несущественны для реальной работы их можно остановить (как правило, это вспомогательные «демоны», различные «украшения» рабочего стола и прочие излишества). Если речь идет о жизненно необходимой прикладной программе, то, возможно, стоит задать вопрос разработчику: «а зачем вот здесь один и тот же файл открывается 27 раз подряд?». Если возможности предъявить претензии разработчикам нет, возможно, остроту проблемы сгладит перемещение этого файла в каталог /tmp (как минимум, это ускорит операции с ним, каталог /tmp в Solaris монтируется в виртуальной памяти и работает значительно быстрее, чем файловая система на диске). Даже простые методы поиска и сокращения ненужных вызовов позволяют иногда добиваться ускорения работы в два--пять раз. Язык программирования D
В DTrace предусматривается возможность не только ввода однострочных команд, но и целых сценариев на языке D. По сути, этот язык представляет собой гибрид подмножества Си, объединенного со специальным набором функций и переменных для упрощения трассировки. Программа на D состоит из серии выражений, каждое из которых описывает один или несколько датчиков DTrace и набор действий, выполняемых при срабатывании датчика. Серии операторов собраны в блоки, ограниченные фигурными скобками после имени датчика, каждый оператор завершается точкой с запятой (;). Сигнал к началу трассировки -- вызов функции trace(), завершения -- функции exit(). Полный набор функций D описан в руководстве Solaris Dynamic Tracing Guide.
Мониторинг процессов Одна из наиболее «дорогих» операций (с точки зрения процессорного времени) – формирование и запуск нового процесса. Соответственно, полезно знать, какие процессы и с какой частотой запускаются при работе конкретной программы. Задаем команду: # dtrace -n 'proc:::exec-success {
В результате запуска, например, команды man ls, можно увидеть какие процессы порождает эта команда: dtrace: description 'proc:::exec-success ' matched 1 probe CPU ID FUNCTION:NAME 0 13772 exec_common:exec-success man ls 0 13772 exec_common:exec-success sh -c cd /usr/man; tbl Множество примеров первых шагов по анализу системы можно найти на странице DTrace Quick Wins: http://www.solarisinternals.com/wiki/index.php/DTrace_Topics_Quick_Wins Мониторинг дисковой активности Работа с дисковой подсистемой -- головная боль многих системных администраторов. Диск занят постоянно, нагрузка большая, очереди длинные. Один способ – реорганизовать дисковую подсистему. Добавить дисков, включить страйпинг и т. п. Но, возможно, этого не требуется? Может быть проблемы вызывает одна-единственная программа, о которой все давно забыли? Как подсчитать объем байтов, передаваемых программами и посмотреть, кто из них «чемпион»? Запускается сценарий DTrace: # dtrace -n 'io:::start { @[pid, execname] =
А в двух других запустим find и tar. Через некоторое время взглянем на результат:
dtrace: description 'io:::start ' matched 6 probes
^C
0 sched 2372608
971 find 3014656
970 tar 4530176
Видно, что tar «перекачал» в полтора раза больше байт, чем find. Выявление источников пиковых нагрузок Часто встречающаяся ситуация: по данным vmstat система загружена на 100%. Естественная реакция администратора -- запуск prstat (или top) с целью выявления программа, создающей избыточную нагрузку на процессор. Но... в таблице prstat/top видно, что процессы, занимающие верхние строчки занимают не больше 2% процессорного времени. Откуда же взялась 100%-нагрузщка? Очень просто: top опрашивает систему раз в несколько секунд и просто «не замечает» большого количества процессов с временем жизни меньше кванта опроса (например, если это миллисекунды). А ведь они могут выполнять системные вызовы, которые «съедают» значительную часть процессорного времени. Классический пример: простой сценарий оболочки # while :; do date; done Приведет к полной загрузке системы, причем, с помощью стандартных средств понять чем же именно она занята -- почти невозможно. Использование программы execsnoop из упоминавшегося набора DTrace Toolkit покажет со всей наглядностью, что в системе постоянно запускаются процессы: -bash-3.00# execsnoop -v STRTIME UID PID PPID ARGS 2007 Apr 14 03:14:55 116755 2167 1251 date 2007 Apr 14 03:14:56 116755 2168 1251 date 2007 Apr 14 03:14:56 116755 2169 1251 date 2007 Apr 14 03:14:57 116755 2170 1251 date 2007 Apr 14 03:14:57 116755 2171 1251 date 2007 Apr 14 03:14:57 116755 2172 1251 date 2007 Apr 14 03:14:57 116755 2173 1251 date 2007 Apr 14 03:14:57 116755 2174 1251 date 2007 Apr 14 03:14:57 116755 2175 1251 date 2007 Apr 14 03:14:57 116755 2176 1251 date 2007 Apr 14 03:14:58 116755 2177 1251 date 2007 Apr 14 03:14:58 116755 2178 1251 date 2007 Apr 14 03:14:58 116755 2179 1251 date 2007 Apr 14 03:14:58 116755 2180 1251 date 2007 Apr 14 03:14:58 116755 2181 1251 date 2007 Apr 14 03:14:58 116755 2182 1251 date 2007 Apr 14 03:14:59 116755 2183 1251 date 2007 Apr 14 03:15:00 116755 2184 1251 date 2007 Apr 14 03:15:00 116755 2185 1251 date DTrace и Java? И DTrace, и Java разработаны в Sun -- а значит могут работать вместе. Один из компонентов DTrace (так называемый провайдер), jstack() может показать содержимое стека Java-программы в какой-то определенный момент (например, при системном вызове read()):
# dtrace -n 'syscall::read:entry /execname == "java"/ { jstack(); }'
dtrace: description 'syscall::read:entry ' matched 1 probe
[...]
CPU ID FUNCTION:NAME
0 75943 read:entry
libc.so.1`_read+0x7
libX11.so.4`_X11TransSocketRead+0x25
libX11.so.4`_X11TransRead+0x17
libX11.so.4`_XRead+0x58
libX11.so.4`_XEventsQueued+0x29e
libX11.so.4`XEventsQueued+0x4f
libmawt.so`Java_sun_awt_X11_XlibWrapper_XEventsQueued+0x1f
sun/awt/X11/XlibWrapper.XEventsQueued(JI)I
sun/awt/X11/XToolkit.run(Z)V
sun/awt/X11/XToolkit.run()V
java/lang/Thread.run()V
StubRoutines (1)
libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue
Сразу видны все взаимосвязи между методами Java и системными вызовами Solaris и легко понять, , что именно происходит в системе, когда выполняется тот или иной метод. DTrace: учебные материалы
Оборотная сторона мощности DTRace -- необходимость достаточно хорошо представлять внутреннее устройство системы. Впрочем, знание основ внутреннего устройства UNIX-подобных систем сегодня стало почти стандартным требованием к квалифицированному системному администратору. И Solaris в этом смысле, пожалуй, наиболее открытая для изучения ОС. Существует превосходная книга Solaris Internals, недавно вышедшая во втором издании, в двух томах (см. также сайт http://solarisinternals.com, где можно найти массу дискуссий и материалов, посвященных разным аспектам работы с Solaris). Очень много материалов по анализу производительности и DTrace. Тем, кого всерьез интересует работа с Solaris, лучше купить книгу, но для первого знакомства можно обойтись материалами с сайта. Кроме этого, исходные тексты операционной системы общедоступны (см. на сайте http://opensolaris.org), это поможет тем, кто хочет совсем уж досконально разобраться с тем, что внутри и, возможно даже скомпилировать свой собственный Solaris. На том же сайте можно найти хорошую подборку материалов о DTrace. Также имеется несколько средств для быстрого знакомства с DTrace. Прежде всего, это DTrace How To Guide, документ с кратким введением и примерами (http://www.sun.com/software/solaris/howtoguides/dtracehowto.jsp). Во-вторых, полезный пакет с набором однострочных команд (one-liners) на основе DTrace, полезных в повседневной работе (http://www.solarisinternals.com/wiki/index.php/DTrace_Topics_One_Liners). И, наконец, нельзя не отметить замечательный набор сценариев DTrace Toolkit (http://www.opensolaris.org/os/community/dtrace/dtracetoolkit/). Он содержит больше сотни утилит, написанных Бренданом Греггом (Brendan Gregg), которые так же полезны, как и упомянутые vmstat и iostat. Когда знакомишься с этим набором, не перестаешь задавать себе вопрос: «как мы раньше жили без этого?». DTrace: полезные примечания
Знакомство с DTrace рекомендуется начинать с загрузки Solaris 10 (http://www.sun.com/software/solaris/get.jsp) или Solaris Express Developer Edition (http://www.sun.com/software/solaris/solaris-express/get.jsp) и его инсталляции (читатели PC Magazine/RE могут установить Solaris 10 с DVD-диска, который прилагался к апрельскому номеру журнала). Те, у кого нет возможности выделить на диске отдельный раздел на диске, могут использовать образ Live CD (на базе OpenSolaris) и загрузиться с него (установки не требуется, система запускается прямо с оптического накопителя). Надо признать, работает это не слишком быстро, но по крайней мере появляется будет возможность попробовать все возможности DTrace. Один из таких проектов Live CD можно найти здесь: http://www.genunix.org/distributions/belenix_site/. Наконец, всегда остается есть возможность запустить Solaris в качестве виртуальной машины VMware Workstation или VMware Player. Готовую виртуальную машину (appliance) можно загрузить с http://developers.sun.com/solaris/downloads/solaris_apps/index.jsp#vmware.
PC Magazine #05, май 2007 | |||||||||||||||||||||||||||||