2/18/2013

Вглубь синтетических джунглей файловой системы sysfs в Linux

Файловая система /sys в Linux отличается от /proc тем, что предоставляет детализированную информацию о работе ядра пользователю (например, параметры устройств и загруженных модулей). Информация строго организована и обычно форматируются простом ASCII тексте, что делает её очень доступной для пользователей и приложений. Так что можно занять шаловливые ручонки чем-нибудь полезным, вроде дёргания разных крутилок в /sys и подсматриванием в системные переменные. Далее - немного подробностей о синтетических джунглях файловой системы /sys.


Зачем нужна /sys, когда есть /proc? 

Основной лейтмотив создания /sys было навести некоторый порядок в том бардаке, который являет из себя /proc и выделить информацию о структурах ядра в отдельную директорию.

Sysfs это
файловая система, находящаяся в памяти (in-memory), основана первоначально на Ramfs, которая в свою очередь была написана во время перехода на ядро 2.4.0. Как говорит один из авторов [1], ``это было упражнение в элегантности, имевшее целью показать, насколько легко написать простую файловую систему, если использовать новый на тот момент слой VFS''. Из-за простоты и использования VFS, это дало здоровую основу для создания других in-memory файловых систем.

При этом sysfs может быть смонтирована, как и любая другая файловая система из пространства пользователя. Большинство дистрибутивов делают это автоматически при старте системы, добавляя соотвутствующую строчку в /etc/fstab.


Что внутри /sys?
Sysfs является каналом распространения информации между ядром и пространством пользователя. Например, есть возможность смены планировщика ввода/вывода или изменения параметров Udev программы. В каталоге /sys находится несколько подкаталогов, представляющих ряд основных подсистем, которые зарегистрированы в Sysfs:
/sys/
|-- block
|-- bus
|-- class
|-- devices
|-- firmware
|-- module
‘-- power


Внутри
/sys/block
Каталог /sys/block содержит подкаталоги для каждого блочного устройства, которое было обнаружено в системе. Там хранятся параметры, которые описывают такие свойства блочных устройств, как размер устройства, его партиции, планировщик ввода-вывода и другие.

Зайдя туда, мы обнаруживаем кучу блочных устройств, среди которых можно найти рабочий винчестер, подключённые флешки и внешние жёсткие диски. Вот что автор этих строк нашёл про свой жёсткий диск, на котором установлен евонный Дебиан:

notebeast:/sys/block/hda# ls -l
итого 0
-r--r--r-- 1 root root 4096 2012-03-03 22:05 capability
-r--r--r-- 1 root root 4096 2012-03-03 22:05 dev
lrwxrwxrwx 1 root root 0 2012-03-03 22:05 device -> ../../devices/pci0000:00/0000:00:1f.1/ide0/0.0
drwxr-xr-x 3 root root 0 2012-03-03 22:05 hda1
drwxr-xr-x 3 root root 0 2012-03-03 22:05 hda2
drwxr-xr-x 2 root root 0 2012-03-03 18:40 holders
drwxr-xr-x 3 root root 0 2012-03-03 22:05 queue
-r--r--r-- 1 root root 4096 2012-03-03 22:05 range
-r--r--r-- 1 root root 4096 2012-03-03 22:05 removable
-r--r--r-- 1 root root 4096 2012-03-03 22:05 size
drwxr-xr-x 2 root root 0 2012-03-03 18:40 slaves
-r--r--r-- 1 root root 4096 2012-03-03 22:05 stat
lrwxrwxrwx 1 root root 0 2012-03-03 22:05 subsystem -> ../../block
--w------- 1 root root 4096 2012-03-03 22:05 uevent
Отсюда мы узнаём, например, что диск /dev/hda разбит на две партиции, hda1 и hda2, размеры которых хранятся в size, что можно достучаться до планировщика I/O в queue   и собрать немножко статистики по работе жёсткого диска в stat. Заглянем туда в поисках приключений и чего-нибудь неизведанного.


Статистика ввода-вывода

Интерфейс /sys/block/sdX/stat даёт некоторые статистические данные о производительности ввода-вывода ядра. Эти данные пользователь или администратор может использовать для оптимизации производительности, если знает, что они значат.

Например, если дать команду:

# cat /sys/block/sda/stat
Мы увидим что-то типа:

186908 41568 6033917 2408504 91198 509600 4882200 9406764 0 1161304 11848624

Эти сакрально-литургические знаки означают следующее:

Поле 1 -- полное число запросов на чтение, выполненных успешно.


Поле 2 -- число объединённых запросов на чтение. Запросы на чтение и запись, примыкающие друг к другу, могут быть объединены для повышения эффективности. Таким образом, два 4K считывания может стать одним 8K считыванием перед тем, как в конечном итоге быть переданы диску. Поэтому запрос будет считаться одним, и это поле позволяет вам узнать, как часто это было сделано.

Поле 3 -- число считанных секторов, чтение которых прошло успешно. 

Поле 4 -- миллисекунд, потраченных на чтение. 

Поле 5 -- число запросов на запись, выполенных успешно.

Поле 6 -- число объединённых запросов на запись. Запросы на чтение и запись, примыкающие друг к другу, могут быть объединены для повышения эффективности. Таким образом, два 4K считывания может стать одним 8K считыванием перед тем, как в конечном итоге быть переданы диску. Поэтому запрос будет считаться одним, и это поле позволяет вам узнать, как часто это было сделано.

Поле 7 -- число секторов, записанных успешно.

Поле 8 -- миллисекунды, потраченные на запись.

Поле 9 -- число запросов ввода-вывода, активных в данный момент. Единственное поле, которое должно стремиться к нулю.

 Поле 10 -- миллисекунд, потраченных на выполнение запросов ввода-вывода. 

Поле 11 -- взвешенное количество миллисекунд, потраченных на ввод-вывод. Может использоваться как простая мера производительности ввода-вывода.




Смена планировщика ввода-вывода на лету

Как нам намекает документация, планировщик ввода-вывода может быть изменён в любое время на лету, хотя может быть небольшая задержка из-за того, что все запросы предыдущего планировщика должны быть обработаны прежде, чем запустится новый. Чтобы узнать, какой планировщик стоит сейчас, даём команду:
cat /sys/block/sdX/queue/scheduler
Заменяя sdX на интересующее нас устройство. Текущий планировщик отмечен в квадратных скобках:
noop anticipatory deadline [cfq]
То есть сейчас стоит cfq - Completely Fair Queuing, полностью честный планировщик. Планировщики для разных дисков могут быть:
  • noop часто наилучший выбор для файловых систем в памяти (например ramdisk) и других устройств без механических частей (флешек), где попытки оптимизировать ввод-вывод приводят лишь к напрасной трате ресурсов.
  • as (anticipatory) по воплощённым в нём идеях схож с deadline, но более навороченный и пытается оптимизировать ввод-вывод с упреждением. Удалён из ядер начиная с 2.6.33.
  • deadline лёгкий планировщик, который пытается установить жёсткий предел на задержки ввода-вывода.
  • cfq поддерживает честное распределение ввода-вывода между процессами, используя концепцию очередей (queue) для каждого процесса. CFQ разедляет синхронные и асинхронные операции ввода-вывода, отдавая предпочтение синхронным операциям. Грубо говоря, CFQ не допускает ситуации, когда один процесс начнёт создавать много операций ввода-вывода, другие процессы могут ``голодать''. Имеет несколько параметров настройки.
Выбор планировщика зависит от задач и оборудования (любопытные бенчмарки для SSD). Более того, у каждого планировщика, как правило, есть настраиваемые параметры. Некоторые соображения можно почерпнуть из поста по ссылке.

Сменить планировщик можно на лету:
# echo "deadline" > /sys/block/sda/queue/scheduler
После этого планировщик для данного диска будет изменён. 
 


И другие каталоги...
 Содержимое других каталогов будет интереснее разработчикам, а не пользователям, и может сильно меняться от версии ядра Linux.

/sys/bus
Это структура шин данных в системе, которая показывает, какая шина куда подключена (например, контроллер USB может быть подключен к шине PCI), и какие устройства в каждой шине потенциально может поддерживать (наряду с соответствующими драйверами), и какие устройства существуют. Здесь есть символической ссылки, которые указывают на директории устройства в глобальном дереве устройств. Каждый тип шины данных представлен двумя подкаталогами: устройств и драйверов.
   
/sys/class
Хранит все классы устройств, зарегистрированные ядром. Используется для описания функционального типа устройств. Большинство подкаталогов содержат символические ссылки на каталоги device и driver. Например, физическое устройство типа мышь может ссылаться на объект ядра "мышь", на устройство input event и input debug. Классы могут включать в себя диски, разделы, последовательные порты, и т.д.  

/sys/devices
Содержит глобальную иерархию устройств: каждое физическое устройство, которые было обнаружено и зарегистрировано ядром.

Например, автор этих строк нашёл:
/sys/devices/virtual/thermal/thermal_zone0/temp  
показания температуры на процессоре в ноутбуке. Исключений два - platform devices и system devices.

Platform devices это периферия (подключаемые устройства), присущие конкретной платформе (порты ввода-вывода, legacy-устройства типа последовательного контроллера или контроллера дискет [floppy controller]).

System devices это устройства, интергрированные в платформу, например аппаратные регистры для доступа к конфигурированию, которые не имеют возможностей обмениваться данными. Обычно для них нет драйверов (процессор, таймеры и другое).
   
/sys/firmware
Cодержит интерфейсы для просмотра и манипулирования firmware-специфичными объектами и их параметрами. Как правило, это платформо-зависимый код, который выполняется в системе при включении, например BIOS.  

/sys/module
Cодержит подкаталоги для каждого загруженного модуля ядра. Имя каталога отражает имя модуля. Ядро имеет глобальное пространство имён для всех модулей. Подкаталоги содержат параметры, специфичные для каждого загруженного модуля. Эта информация используется для отладки и простым смертным не будет интересна.  

/sys/power
Это скорее заделка на будущее. Может содержать название состояния, которое позволит процессу переходить в режим пониженного энергопотребления.
В зависимости от версии ядра, в /sys могут появляться и другие каталоги.


Ссылки
Есть любопытный документец [1] The sysfs Filesystem, OLS'05 на 14 страниц, написанная тем водянистым и пустозвонным стилем, коий так не переваривает автор этих строк. Документация к ядру тоже не особенно жаждет подробно рассказать о том, что означают все эти переменные и отгораживается вот этим:

TODO: Finish this section.
Понятно, что это самое туду не входит в приоритетный список дел. Но кое-что выудить всё-таки можно. Надеюсь, что этот пост несколько приподымет завесу тайны с файловой системы /sys.

8 комментариев:

  1. Спасибо, познавательно. Надо отметить, что за три года пользовательского стажа мне понадобилось лазать лишь в /sys/class, куда монтируется debugfs. Но теперь-то да! Теперь мои шаловливые ручонки попытаются ещё и обнаружить, где лежат сведения об аккумуляторе батареи :)

    ОтветитьУдалить
  2. Автор, спасибо за инфо! Но обьясните, пожалуйста: что значит "евоный"? Наверное, хотелось сказать "ебаный"?

    ОтветитьУдалить
  3. @redVi комментирует...
    Надо отметить, что за три года пользовательского стажа мне понадобилось лазать лишь в /sys/class, куда монтируется debugfs.
    Я часто переключаю io schedulers и использую /sys/block/sda/stat
    поэтому решил всё собрать в один пост.

    Вообще, в Сети довольно немного информации по поводу /sys - насколько я понимаю, там всё довольно быстро меняется.

    Теперь мои шаловливые ручонки попытаются ещё и обнаружить, где лежат сведения об аккумуляторе батареи
    Это и для меня было большим сюрпризом: я искал это дело в /proc, а оно оказалось в /sys.

    @просто торкнуло комментирует...
    Автор, спасибо за инфо! Но обьясните, пожалуйста: что значит "евоный"?
    Автор решил бл(я)еснуть своими познаниями старорусского и употребить народное\просторечное словцо для "его".

    Наверное, хотелось сказать
    Хотелось сказать то, что хотелось, и ничего больше. И словарь Даля гарантирует это :-)

    ОтветитьУдалить
  4. Что делают hda диски в статье 2013 года?

    ОтветитьУдалить
  5. @Анонимный комментирует...
    Что делают hda диски в статье 2013 года?

    Как и многие другие статьи этого блога, эта была написана не сразу и не вчера. Часть статьи, в которой светятся hda диски, написана на ноутбуке времён XXV съезда ЦККПСС, а там Debian Etch (!), IDE винчестер (всё ещё живой, кстати) и ядро 2.6.15.

    На изложенный материал это не влияет.

    Да, я заметил, что кусок про schedulers идёт между описанием статистики из /sys/block/sdX/stat -- как-то оно нелогично. Поменял блоки текста местами, немного поправил и добавил ссылок для чтения.

    ОтветитьУдалить
  6. Спасибо, автор!

    ОтветитьУдалить
  7. @Анонимный комментирует...
    Спасибо, автор!
    Всегда пожалуйста.

    Кстати, если кто владеет сакральными познаниями по файловой системе /SYS - оставляйте комментарии. Разработчики ядра не шибко торопятся писать документацию с пояснениями того, что всё это значит.

    ОтветитьУдалить
  8. echo "- - - " > /sys/class/scsi_host/hostX/scan - пересканить скази-девайсы на HBA без ребута

    cat /sys/class/scsi_host/hostX/proc_name - понятно

    ls /sys/class/fc_host/ - смотрим FC HBA

    echo 1 >/sys/class/fc_host/hostX/issue_lip - просим рескан FC bus

    ОтветитьУдалить