Tuesday, July 1, 2025

Мощь у вас на службе – управление электропитанием во FreeBSD

 Оригинал: https://vermaden.wordpress.com/2018/11/28/the-power-to-serve-freebsd-power-management/

"Мощь у вас на службе" - девиз операционной системы FreeBSD, который отлично подходит к теме статьи. Десять лет назад (статья за 2022 год) - как быстро летит время - я даже сделал обои на на рабочий стол с этим лозунгом - картинка доступна по ссылке https://www.deviantart.com/vermaden/art/FreeBSD-Power-To-Serve-White-82309017

Настало время для статьи по теме управления питанием во FreeBSD - статья также относится к теме "FreeBSD на десктопе", но не только. Похоже, среди пользователей широко распространено мнение, что FreeBSD до такой степени ориентирована на серверы, что в ней отсутствуют механизмы энергосбережения. Как же они далеки от истины. На десктопах и серверах настройка потребления электроэнергии играет не слишком важную роль (хотя вы будете меньше платить за свет), но на ноутбуках корректные настройки помогут увеличить время работы от батареи и снизить шум вентилятора.

Я решил написать этот обзор, т.к. в соответствующей главе руководства пользователя FreeBSD (14.6 Power and Resource Management) не охвачены все аспекты, а статья в вики (https://wiki.freebsd.org/TuningPowerConsumption#A3._Memory) частично устарела.

FreeBSD предлагает много механизмов управления питанием:

1. Отключение устройств, не имеющих драйвера
2. Регулирование частоты и мощности ЦПУ
3. Поддержка состояний сна процессора (C1/C1E/C2/C3/…)
4. Включение/отключение режима турбо, доступного для большинства процессоров
5. Управление питанием устройств, подключенных по USB.
6. Управление питанием контроллеров и каналов передачи данных SATA/AHCI
7. Поддержка спящего режима с возможностью вхождения в него по закрытию крышки
8. Поддержка специфичных инструментов измерения потребления энергии от производителей оборудования
9. Регулирования скорости вращения вентилятора*

* Прим. переводчика: реализовано модулем acpi, который может не поддерживать ваш ноутбук, даже если система в целом поддерживает. У меня так и было: вентилятор молотил постоянно на полной мощности, из спящего режима ноут выходил через раз. Я понимаю, что спящий режим связан с прошивкой, но в линуксе (Slackware, Opensuse, PCLinuxos) такого вообще никогда не было.


10. Изменения яркости монитора
11. Индикация состояния батареи и оставшегося времени использования ноутбука от батареи
12. Управление питанием сетевых интерфейсов
13. Поддержка AMD PowerNow
14. Поддержка Intel Speed Step и Intel Speed Shift
15. Поддержка AMD Turbo core
16. Поддержка Intel Turbo boost

Пара слов о файлах, где хранятся системные настройки во FreeBSD:

/etc/rc.conf - не требует перезагрузки системы после редактирования, только перезагрузку демонов.
/etc/sysctl.conf - не требует перезагрузки, можно редактировать во время работы машины.
/boot/loader.conf - требует перезагрузки после редактирования.


Содержание статьи:

Просмотр текущих показаний:
Батарея
Износ батареи
Процессор
lscpu (1)
dmesg (8)


Регулирование частоты процессора:
powerd
powerdxx
C-States
Режим турбо


Устройства usb

Управление питанием SATA/AHCI

▪ Устройства без драйвера:
Nvidia Optimus

▪ Переход в спящий режим и выход из него

▪ Сетевые карты

▪ Инструменты производителей устройств


DTrace

Другое:
ZFS
Приложения

▪ Оборудование

▪ Обновление 1: управление питанием графических карт

▪ Обновление 2: Температура процессоров AMD

▪ Обновление 3: Intel Speed Shift


Просмотр текущих показаний


Давайте начнём с того, как посмотреть данные о текущей частоте и состоянии процессора, режиме управления питанием устройств USB, ёмкость батареи и т.д.

    ◆ БАТАРЕЯ


Для просмотра статуса аккумулятора можно воспользоваться утилитой acpiconf(8). Вот её вывод для основной батареи ноутбука ThinkPad T420s, включенного в сеть:


% acpiconf -i 0
Design capacity: 44000 mWh
Last full capacity: 37930 mWh
Technology: secondary (rechargeable)
Design voltage: 11100 mV
Capacity (warn): 1896 mWh
Capacity (low): 200 mWh
Low/warn granularity: 1 mWh
Warn/full granularity: 1 mWh
Model number: 45N1037
Serial number: 28608
Type: LION
OEM info: SANYO
State: high
Remaining capacity: 100%
Remaining time: unknown
Present rate: 0 mW
Present voltage: 12495 mV

...а теперь отключим ноутбук от сети:

% acpiconf -i 0
Design capacity: 44000 mWh
Last full capacity: 37930 mWh
Technology: secondary (rechargeable)
Design voltage: 11100 mV
Capacity (warn): 1896 mWh
Capacity (low): 200 mWh
Low/warn granularity: 1 mWh
Warn/full granularity: 1 mWh
Model number: 45N1037
Serial number: 28608
Type: LION
OEM info: SANYO
State: high
Remaining capacity: 100%
Remaining time: 2:31
Present rate: 0 mW
Present voltage: 12492 mV

В поле Remaining time отображается приблизительное значение оставшегося времени работы батареи - 2 часа 31 минута.

А вот вывод acpiconf для второй батареи, которая находится в отсеке ultrabay, где был привод DVD:

% acpiconf -i 1
Design capacity: 31320 mWh
Last full capacity: 24510 mWh
Technology: secondary (rechargeable)
Design voltage: 10800 mV
Capacity (warn): 1225 mWh
Capacity (low): 200 mWh
Low/warn granularity: 1 mWh
Warn/full granularity: 1 mWh
Model number: 45N1041
Serial number: 260
Type: LiP
OEM info: SONY
State: high
Remaining capacity: 100%
Remaining time: unknown
Present rate: 0 mW
Present voltage: 12082 mV

Отсоединим ноутбук от сети:


% acpiconf -i 1
Design capacity: 31320 mWh
Last full capacity: 24510 mWh
Technology: secondary (rechargeable)
Design voltage: 10800 mV
Capacity (warn): 1225 mWh
Capacity (low): 200 mWh
Low/warn granularity: 1 mWh
Warn/full granularity: 1 mWh
Model number: 45N1041
Serial number: 260
Type: LiP
OEM info: SONY
State: discharging
Remaining capacity: 98%
Remaining time: 1:36
Present rate: 14986 mW
Present voltage: 11810 mV

При отключении от сети оставшееся время равно 1:36.

Таким образом, общее время работы от батареи составит примерно 4 часа 07 минут. То же самое значение в минутах (247) отобразится в выводе команды sysctl(8):

% sysctl hw.acpi.battery.time

hw.acpi.battery.time: 247

С помощью sysctl можно получить более подробную информацию, если вместо hw.acpi.battery.time передать ей значение hw.acpi.battery:


% sysctl hw.acpi.battery
hw.acpi.battery.info_expire: 5
hw.acpi.battery.units: 2
hw.acpi.battery.state: 1
hw.acpi.battery.time: 247
hw.acpi.battery.life: 99

При подключении к сети поле hw.acpi.battery.time будет иметь значение "-1":

% sysctl hw.acpi.battery
hw.acpi.battery.info_expire: 5
hw.acpi.battery.units: 2
hw.acpi.battery.state: 0
hw.acpi.battery.time: -1
hw.acpi.battery.life: 100


▪ Износ батареи


Со временем аккумуляторы постепенно утрачивают ёмкость. Через 1-2 года от изначальной ёмкости останется около 70%. Информация об износе содержится в полях Design capacity и Last full capacity. Я написал скрипт battery-capacity.sh, который показывает текущую ёмкость батареи в процентах от изначальной. Результат его работы выглядит так:

% battery-capacity.sh 0

Battery '0' model '45N1037' has efficiency: 86%

% battery-capacity.sh 1
Battery '1' model '45N1041' has efficiency: 78%

А вот сам скрипт:


#! /bin/sh

if [ ${#} -ne 1 ]
then
echo "usage: ${0##*/} BATTERY"
exit
fi

if acpiconf -i $1 1> /dev/null 2> /dev/null
then
DATA=$( acpiconf -i $1 )
MAX=$( echo "$data" | grep '^Design\ capacity:' | awk -F ':' '{print $2}' | tr -c -d '0-9' )
NOW=$( echo "$data" | grep '^Last\ full\ capacity:' | awk -F ':' '{print $2}' | tr -c -d '0-9' )
MOD=$( echo "$data" | grep '^Model\ number:' | awk -F ':' '{print $2}' | awk '{print $1}' )
echo -n "Battery '$1' model '$Mod' has efficiency: "
printf '%1.0f%%\n' $( bc -l -e "scale = 2; $now / $Max * 100" -e quit )
else
echo "NOPE: Battery '$1' does not exists on this system."
echo "INFO: Most systems has only '0' or '1' batteries."
exit 1
fi


    ◆ ПРОЦЕССОР


Информацию о состоянии процессора также можно получить с помощью команды sysctl, если передать ей значение dev.cpu.0 для первого физического ядра, dev.cpu.1 - для второго:


% sysctl dev.cpu.0
dev.cpu.0.cx_method: C1/hlt C2/io
dev.cpu.0.cx_usage_counters: 412905 0
dev.cpu.0.cx_usage: 100.00% 0.00% last 290us
dev.cpu.0.cx_lowest: C1
dev.cpu.0.cx_supported: C1/1/1 C2/3/104
dev.cpu.0.freq_levels: 2501/35000 2500/35000 2200/29755 2000/26426 1800/23233 1600/20164 1400/17226 1200/14408 1000/11713 800/9140
dev.cpu.0.freq: 800
dev.cpu.0.%parent: acpi0
dev.cpu.0.%pnpinfo: _HID=none _UID=0
dev.cpu.0.%location: handle=\_PR_.CPU0
dev.cpu.0.%driver: cpu
dev.cpu.0.%desc: ACPI CPU

Если с помощью команды kldload(8) загрузить модуль ядра coretemp(4), вы получите вдобавок показания температуры:

% sysctl dev.cpu.0
dev.cpu.0.temperature: 49.0C
dev.cpu.0.coretemp.throttle_log: 0
dev.cpu.0.coretemp.tjmax: 100.0C
dev.cpu.0.coretemp.resolution: 1
dev.cpu.0.coretemp.delta: 51
dev.cpu.0.cx_method: C1/hlt C2/io
dev.cpu.0.cx_usage_counters: 16549 0
dev.cpu.0.cx_usage: 100.00% 0.00% last 1489us
dev.cpu.0.cx_lowest: C1
dev.cpu.0.cx_supported: C1/1/1 C2/3/104
dev.cpu.0.freq_levels: 2501/35000 2500/35000 2200/29755 2000/26426 1800/23233 1600/20164 1400/17226 1200/14408 1000/11713 800/9140
dev.cpu.0.freq: 800
dev.cpu.0.%parent: acpi0
dev.cpu.0.%pnpinfo: _HID=none _UID=0
dev.cpu.0.%location: handle=\_PR_.CPU0
dev.cpu.0.%driver: cpu
dev.cpu.0.%desc: ACPI CPU

Остановимся подробней на самых важных показателях:

Температура ядра процессора:


dev.cpu.0.temperature: 49.0C

Состояния сна, которые поддерживает процессор:


dev.cpu.0.cx_supported: C1/1/1 C2/3/104

Статистика пребывания процессора в состоянии сна (доступен только С1):


dev.cpu.0.cx_usage_counters: 16549 0
dev.cpu.0.cx_usage: 100.00% 0.00% last 1489us

Самое глубокое поддерживаемое состояние сна:
dev.cpu.0.cx_lowest: C1


Поддерживаемые процессором частоты и соответствующая потребляемая мощность через '/': 2500/35000 означает частоту 2,5 гигагерц и потребление мощности 35 ватт; 2501 - режим турбо. Минимальная частота 800 Mгц и потребление 9 Вт:

dev.cpu.0.freq_levels: 2501/35000 2500/35000 2200/29755 2000/26426 1800/23233 1600/20164 1400/17226 1200/14408 1000/11713 800/9140


Текущая частота процессора (будет разной при использовании демонов powerd или powerdxx)

dev.cpu.0.freq: 800


Текущая температура материнской платы:

% sysctl hw.acpi.thermal.tz0.temperature

 
hw.acpi.thermal.tz0.temperature: 49.1C


Чтобы посмотреть, сколько ядер в вашем процессоре, наберите одну из команд:

% grep FreeBSD/SMP /var/run/dmesg.boot

 
FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
FreeBSD/SMP: 1 package(s) x 2 core(s)

% sysctl kern.smp.cpus

 
kern.smp.cpus: 2


Если описанное выше вам не нужно, можете использовать команду sysctl с флагом -d:

% sysctl -d dev.cpu.0.freq

 
dev.cpu.0.freq: Current CPU frequency


● lscpu


Есть сторонняя утилита под названием lscpu(8), которая выводит модель и характеристики процессора. Её нужно установить с помощью пакетного менеджера:

# pkg install lscpu

Для работы ей нужен модуль ядра cpuctl(4). Вот как выглядит её вывод у меня:


# kldload cpuctl
# lscpu

Architecture:            amd64
Byte Order:              Little Endian
Total CPU(s):            2
Thread(s) per core:      2
Core(s) per socket:      2
Socket(s):               0
Vendor:                  GenuineIntel
CPU family:              6
Model:                   42
Model name:              Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
Stepping:                7
L1d cache:               32K
L1i cache:               32K
L2 cache:                256K
L3 cache:                3M
Flags:                   fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 cflsh ds acpi mmx fxsr sse sse2 ss htt tm pbe sse3 pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline aes xsave osxsave avx syscall nx rdtscp lm lahf_lm

dmesg(8)

Также команда dmesg(8) (или файл /var/run/dmesg.boot, если прошло много времени после загрузки) выводит информацию о модели процессора и его характеристиках.

% grep CPU /var/run/dmesg.boot
CPU: Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz (2491.97-MHz K8-class CPU)
FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
cpu0:  on acpi0
coretemp0:  on cpu0


● Масштабирование частоты процессора.


Для этих целей используется демон powerd(8), включенный в установочный образ системы, или powerdxx(8) из портов или репозитория. Демон powerdxx нацелен на масштабирование частоты многоядерных процессоров: он не переводит все ядра в высокое состояние при умеренной нагрузке на систему, но некоторые предпочитают такой подход, чтобы при высокой нагрузке процессор работал на полную мощность, а при её отсутствии экономилась энергия. Т.о., нельзя сказать, что powerd лучше, чем powerdxx, или наоборот - они просто разные, что даёт вам выбор в зависимости от ваших запросов.

Оба демона настраиваются через файл /etc/rc.conf.


    POWERD(8)


Вот параметры для powerd:

powerd_enable=YES
powerd_flags="-n adaptive -a hiadaptive -b adaptive -m 800 -M 1600"

Параметр "-n" обозначает режим работы демона в неопределённом состоянии системы - т.е. когда демон не может определить, работаете вы от сети или от батареи. Параметр "-a" задаёт режим для работы от сети, "-b" - от батареи. Режим adaptive менее "агрессивный" и позволяет продлить время работы от батареи. Режим hiadaptive более агрессивный,  его предпочтительно использовать при работе от сети. Параметр "-m" задаёт минимальную частоту процессора, до которой демон будет понижать, а "-M" - максимальную. Частоты выражаются в мегагерцах. Подробности настройки вы можете узнать на справочной страницы man powerd(8).

    

    POWERDXX(8)


Сначала потребуется его установить:

# pkg install powerdxx

 
Параметры  аналогичны таковым для powerd:

powerdxx_enable=YES
powerdxx_flags="-n adaptive -a hiadaptive -b adaptive -m 800 -M 1600"

Лет десять назад настройка масштабирования частоты ЦПУ не была такой простой - можете посмотреть, как это было, в моём посте от 2008 года:  HOWTO: FreeBSD CPU Scaling and Power Saving:  https://forums.freebsd.org/threads/howto-freebsd-cpu-scaling-and-power-saving.172/

● C-СОСТОЯНИЯ


С-состояния настраиваются в файле /etc/rc.conf с помощью следующих параметров:

    performance_cx_lowest
    economy_cx_lowest

Параметр economy_cx_lowest предназначен для работы от батареи, а performance_cx_lowest - для работы от сети. Оба устанавливаются скриптом /etc/rc.d/power_profile, который запускается системой инициализации rc(8). Скрипт устанавливает значение параметра  hw.acpi.cpu.cx_lowest, который задаёт и управляет всеми значениями dev.cpu.*.cx_lowest. Можете отсоединить и подсоединить сетевой кабель и посмотреть за изменениями в файле /var/log/messages:

% tail -f /var/log/messages
Nov 28 13:14:42 t420s power_profile[48231]: changed to 'economy'
Nov 28 13:14:46 t420s power_profile[56835]: changed to 'performance'

Я обычно использую такие значения:

performance_cx_lowest=C1
economy_cx_lowest=Cmax

В большинстве случаев этих настроек будет достаточно. Чтобы узнать, какие С-состояния поддерживает ваш процессор, посмотрите значение параметра dev.cpu.0.cx_supported:

% sysctl dev.cpu.0.cx_supported
dev.cpu.0.cx_supported: C1/1/1 C2/3/104

Мой процессор поддерживает только С1 и С2, но у вас их может быть больше. Я помню, что на старом ноутбуке с процессором Core2Duo была заметная задержка при переходе из активного состояния С1 в состояние сна С2. В таком случае вы можете не использовать параметры performance_cx_lowest и economy_cx_lowest, а выставить для одного ядра С1, а для остальных - С2. Таким образом ваша система будет отзывчивой даже при работе от батареи, а энергосбережение будет происходить за счёт спящих ядер.

Например, если у вас 4 ядра, и максимальное (самое глубокое) С-состояние - С3, то можете прописать такие настройки в файл /etc/rc.conf:

% grep cx_lowest /etc/sysctl.conf
dev.cpu.0.cx_lowest=C1
dev.cpu.1.cx_lowest=C3
dev.cpu.2.cx_lowest=C3
dev.cpu.3.cx_lowest=C3


● РЕЖИМ ТУРБО ДЛЯ ПРОЦЕССОРА


Включить турбо-режим можно двумя способами:

1. Если вы пользуетесь демонами powerd или powerdxx, установите максимальную частоту выше номинальной. Например, если ваш процессор поддерживает максимальную частоту 2.5 Ггц, то флаг "-M" можно установить, например, в 4000 Мгц (4 Ггц).
2. Если вы не пользуетесь службами масштабирования частоты процессора, то нужно установить параметр  dev.cpu.0.freq  в самое высокое значение из поддерживаемых системой, которые перечислены в dev.cpu.0.freq_levels.

Вот список поддерживаемых значений частоты моего процессора:

% sysctl dev.cpu.0.freq_levels
dev.cpu.0.freq_levels: 2501/35000 2500/35000 2200/29755 2000/26426 1800/23233 1600/20164 1400/17226 1200/14408 1000/11713 800/9140

Крайнее левое значение 2501/35000 является максимальным, значит, для включения турбо-режима надо присвоить это значение параметру dev.cpu.0.freq. При этом нужно указать только значение частоты, так как, если вы укажете ещё и мощность, то sysctl не примет параметр:

# sysctl dev.cpu.0.freq=2501/35000
sysctl: invalid integer '2501/35000'


Надо так:

# sysctl dev.cpu.0.freq=2501
dev.cpu.0.freq: 800 -> 2501

    ◆ УСТРОЙСТВА USB


Для просмотра списка подключенных устройств есть утилита usbconfig(8).

% usbconfig
ugen1.1:  at usbus1, cfg=0 md=HOST spd=SUPER (5.0Gbps) pwr=SAVE (0mA)
ugen2.1:  at usbus2, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE (0mA)
ugen0.1:  at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE (0mA)
ugen2.2:  at usbus2, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE (0mA)
ugen0.2:  at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE (0mA)
ugen0.3:  at usbus0, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (100mA)
ugen2.3:  at usbus2, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE (0mA)

Параметр pwr (сокращение от power) указывает на текущее состояние параметра электропотребления. Возможны следующие варианты:

    ▪ ON
    ▪ OFF
    ▪ SAVE

Чтобы изменить состояние для устройства ugen1.1, воспользуйтесь той же утилитой usbconfig для изменения параметра power_save следующим образом:


# usbconfig -u 1 -a 1 power_save

Для управления питанием устройств USB во Freebsd нет отдельного конфигурационного файла, поэтому настройки нужно поместить в универсальный /etc/rc.local, который запускается службой rc в конце, после остальных скриптов инициализации. Вот пример конфига, где исключение сделано для устройства Lenovo USB Receiver - это моя беспроводная мышь:

% grep -A 10 POWER /etc/rc.local
# POWER SAVE USB DEVICES
usbconfig \
  | grep -v 'Lenovo USB Receiver' \
  | grep -v 'Unifying Receiver Logitech' \
  | awk '{print $1}' \
  | sed 's|ugen||'g \
  | tr -d : \
  | awk -F '.' '{print $1 " " $2 }' \
  | while read U A
    do
      usbconfig -u ${U} -a ${A} power_save 2> /dev/null
    done

Не включать энергосбережение для мышей и подобных устройств ввода - хорошая идея, так как иначе придётся ждать пару секунд каждый раз, когда вы захотите ими воспользоваться, что будет раздражать. Чтобы настроить энергосбережение для всех устройств USB, кроме беспроводной мыши (которая распозналась как  'Lenovo USB Receiver'), я использовал цикл for.

    ◆ УПРАВЛЕНИЕ ПИТАНИЕМ КОНТРОЛЛЕРОВ SATA/AHCI


Во FreeBSD есть драйвер для управления каналами AHCI - это acpich(4). Настройки управления электропитанием устанавливаются во время загрузки через параметр hint.ahcich.*.pm_level файла /boot/loader.conf. У меня настраивается до 8 каналов, хотя в системе присутствуют только три.

% grep ahcich /var/run/dmesg.boot
ahcich0:  at channel 0 on ahci0
ahcich1:  at channel 1 on ahci0
ahcich4:  at channel 4 on ahci0
ada0 at ahcich0 bus 0 scbus0 target 0 lun 0

Настройки для несуществующих устройств не создают проблем и не приводят к появлению сообщений об ошибках, зато можно пользоваться одним конфигурационным файлом на разных системах. Вот описание параметра hint.ahcich.*.pm_level со справочной страницы man ahci(4):

" hint.ahcich.X.pm_level

    Управляет питанием интерфейса SATA на указанном канале, позволяет сэкономить некоторое количество энергии за счёт увеличения задержки выполнения команд.

    Некоторые контроллеры, такие как  ICH8, не поддерживают режимы 2 и 3 при использовании NCQ. Из-за искусственно созданной задержки ввода данных снижение производительности в режимах 4 и 5 гораздо меньше, чем в режимах 2 и 3."

Поддерживаемые драйвером варианты управления питанием:

0 - управление питанием интерфейса отключено (по умолчанию)
1 - изменение статуса управления питанием инициируется устройством, а не хостом
2 - хост инициирует переход в состояние PARTIAL каждый раз, когда порт переходит в состояние ожидания
3 - хост инициирует переход в состояние SLUMBER каждый раз, когда порт переходит в состояние ожидания
4 - драйвер инициирует переход в состояние PARTIAL спустя 1 секунду после перехода порта в состояние ожидания
5 - драйвер инициирует переход в состояние SLUMBER спустя 125 миллисекунд после перехода порта в состояние ожидания

Вот мои настройки из файла /boot/loader.conf:

# AHCI POWER MANAGEMENT FOR EVERY USED CHANNEL (ahcich 0-7)
  hint.ahcich.0.pm_level=5
  hint.ahcich.1.pm_level=5
  hint.ahcich.2.pm_level=5
  hint.ahcich.3.pm_level=5
  hint.ahcich.4.pm_level=5
  hint.ahcich.5.pm_level=5
  hint.ahcich.6.pm_level=5
  hint.ahcich.7.pm_level=5

◆ УСТРОЙСТВА БЕЗ ДРАЙВЕРА


Во FreeBSD есть возможность не подавать питание на устройства, для которых в системе нет драйвера. За это отвечает параметр hw.pci.do_power_nodriver, который устанавливается в файле /boot/loader.conf. Вот его описание со страницы руководства man pci(4):


 "hw.pci.do_power_nodriver (Defaults to 0)

Переводит устройство в состояние сниженного энергопотребления (D3), если для него нет подходящего драйвера.

Этот параметр может принимать одно из следующих значений:

0 - все устройства включены и потребляют максимум энергии (по умолчанию)
1 - как 2, но контроллеры памяти также не отключаются
2 - большинство устройств отключены, кроме дисплея, памяти и периферии
3 - отключает все устройства PCI, для которых нет драйвера"

Вот мои настройки из файла /boot/loader.conf:

# POWER OFF DEVICES WITHOUT ATTACHED DRIVER
  hw.pci.do_power_nodriver=3

Команда pciconf(8) показывает, какие устройства есть в системе и какими драйверами они управляются. Если драйвера в системе нет, вы увидите "none*@" вместо названия устройства - в примере ниже это "none0@". Для большинства драйверов есть страницы справочного руководства - например, для драйвера устройства em0 страница man em(4), а для устройства xhci0 - страница man xhci(4).

% pciconf -l
hostb0@pci0:0:0:0:      class=0x060000 card=0x21d217aa chip=0x01048086 rev=0x09 hdr=0x00
vgapci0@pci0:0:2:0:     class=0x030000 card=0x21d217aa chip=0x01268086 rev=0x09 hdr=0x00
none0@pci0:0:22:0:      class=0x078000 card=0x21d217aa chip=0x1c3a8086 rev=0x04 hdr=0x00
em0@pci0:0:25:0:        class=0x020000 card=0x21ce17aa chip=0x15028086 rev=0x04 hdr=0x00
ehci0@pci0:0:26:0:      class=0x0c0320 card=0x21d217aa chip=0x1c2d8086 rev=0x04 hdr=0x00
hdac0@pci0:0:27:0:      class=0x040300 card=0x21d217aa chip=0x1c208086 rev=0x04 hdr=0x00
pcib1@pci0:0:28:0:      class=0x060400 card=0x21d217aa chip=0x1c108086 rev=0xb4 hdr=0x01
pcib2@pci0:0:28:1:      class=0x060400 card=0x21d217aa chip=0x1c128086 rev=0xb4 hdr=0x01
pcib3@pci0:0:28:3:      class=0x060400 card=0x21d217aa chip=0x1c168086 rev=0xb4 hdr=0x01
pcib4@pci0:0:28:4:      class=0x060400 card=0x21d217aa chip=0x1c188086 rev=0xb4 hdr=0x01
ehci1@pci0:0:29:0:      class=0x0c0320 card=0x21d217aa chip=0x1c268086 rev=0x04 hdr=0x00
isab0@pci0:0:31:0:      class=0x060100 card=0x21d217aa chip=0x1c4f8086 rev=0x04 hdr=0x00
ahci0@pci0:0:31:2:      class=0x010601 card=0x21d217aa chip=0x1c038086 rev=0x04 hdr=0x00
ichsmb0@pci0:0:31:3:    class=0x0c0500 card=0x21d217aa chip=0x1c228086 rev=0x04 hdr=0x00
iwn0@pci0:3:0:0:        class=0x028000 card=0x11118086 chip=0x42388086 rev=0x3e hdr=0x00
sdhci_pci0@pci0:5:0:0:  class=0x088000 card=0x21d217aa chip=0xe8221180 rev=0x07 hdr=0x00
xhci0@pci0:13:0:0:      class=0x0c0330 card=0x01941033 chip=0x01941033 rev=0x04 hdr=0x00

Для более подробного вывода используйте флаг -v:


% pciconf -l -v
(...)
xhci0@pci0:13:0:0:      class=0x0c0330 card=0x01941033 chip=0x01941033 rev=0x04 hdr=0x00
    vendor     = 'NEC Corporation'
    device     = 'uPD720200 USB 3.0 Host Controller'
    class      = serial bus
    subclass   = USB



◆ Nvidia OPTIMUS


Если по каким-то причинам вы не можете отключить дискретную видеокарту Nvidia в BIOS/UEFI, то можете сделать это с помощью скрипта, и карта не будет потреблять энергию. Для работы скрипта нужен модуль acpi_call(4), который входит в пакет acpi_call.


# mkdir /root/bin
# cd /root/bin
# fetch https://people.freebsd.org/~xmj/turn_off_gpu.sh
# pkg install acpi_call
# kldload acpi_call
# chmod +x /root/bin/turn_off_gpu.sh
# /root/bin/turn_off_gpu.sh

Вы можете прописать скрипт в файл /etc/rc.local после параметров энергосбережения устройств USB таким образом:


# DISABLE NVIDIA CARD
  /root/bin/turn_off_gpu.sh

При этом работающий вызов ACPI будет храниться в файле /root/.gpu_method и выполняться каждый раз при загрузке.



◆ СПЯЩИЙ РЕЖИМ И ВЫХОД ИЗ НЕГО


Злейшие враги корректного входа и выхода из спящего режима - это баги в прошивке вашего ноутбука (BIOS или UEFI). Иногда помогает отключения Bluetooth - например, это работает на ThinkPad T420s. Чтобы посмотреть, какие режимы сна доступны в вашей системе, проверьте значение параметра  hw.acpi.supported_sleep_state подсистемы sysctl(8):

% sysctl hw.acpi.supported_sleep_state
hw.acpi.supported_sleep_state: S3 S4 S5

Чтобы перевести систему в состояние сна ACPI S3 (suspend - ждущий режим), можно воспользоваться утилитами acpiconf(8) или zzz(8):

# zzz

или

# acpiconf -s 3


На странице руководства для zzz(8) сказано, что это одно и то же.


Также можно задать параметр sysctl(8), чтобы ноутбук переходил в режим ожидания каждый раз, когда вы закрываете крышку. Для этого в файле /etc/sysctl.conf нужно выставить значение hw.acpi.lid_switch_state=S3. Независимо от способа перехода в спящий режим - закрытие крышки или команда, - после открытия крышки ноутбук выйдет из него. Если вы дали команду zzz и не закрыли крышку, то для выхода из сна её надо либо закрыть и открыть, либо нажать копку питания. Разумеется, эти команды работают не только на ноутбуках - вы можете пользоваться ими на десктопе или даже на сервере.

Для подсистем ACPI от разных производителей существуют свои модули ядра. Вот они:


    /boot/kernel/acpi_asus_wmi.ko
    /boot/kernel/acpi_asus.ko
    /boot/kernel/acpi_dock.ko
    /boot/kernel/acpi_fujitsu.ko
    /boot/kernel/acpi_hp.ko
    /boot/kernel/acpi_ibm.ko
    /boot/kernel/acpi_panasonic.ko
    /boot/kernel/acpi_sony.ko
    /boot/kernel/acpi_toshiba.ko
    /boot/kernel/acpi_video.ko
    /boot/kernel/acpi_wmi.ko

Например, если у вас IBM/Lenovo ThinkPad, воспользуйтесь модулем acpi_ibm.ko:

# kldload acpi_ibm

После загрузки соответствующего модуля у вас появятся новые параметры sysctl, которые можно будет настроить - например скорость вращения вентилятора, подсветка клавиатуры или яркость монитора. Ниже приведен раздел dev.acpi_ibm, появившийся в sysctl после загрузки модуля ядра  acpi_ibm(4):

% sysctl dev.acpi_ibm
dev.acpi_ibm.0.handlerevents: NONE
dev.acpi_ibm.0.mic_led: 0
dev.acpi_ibm.0.fan: 0
dev.acpi_ibm.0.fan_level: 0
dev.acpi_ibm.0.fan_speed: 0
dev.acpi_ibm.0.wlan: 1
dev.acpi_ibm.0.bluetooth: 0
dev.acpi_ibm.0.thinklight: 0
dev.acpi_ibm.0.mute: 0
dev.acpi_ibm.0.volume: 0
dev.acpi_ibm.0.lcd_brightness: 0
dev.acpi_ibm.0.hotkey: 1425
dev.acpi_ibm.0.eventmask: 134217727
dev.acpi_ibm.0.events: 1
dev.acpi_ibm.0.availmask: 134217727
dev.acpi_ibm.0.initialmask: 2060
dev.acpi_ibm.0.%parent: acpi0
dev.acpi_ibm.0.%pnpinfo: _HID=LEN0068 _UID=0
dev.acpi_ibm.0.%location: handle=\_SB_.PCI0.LPC_.EC__.HKEY
dev.acpi_ibm.0.%driver: acpi_ibm
dev.acpi_ibm.0.%desc: IBM ThinkPad ACPI Extras
dev.acpi_ibm.%parent:

Вот описание наиболее важных параметров:

dev.acpi_ibm.0.mic_led - включение светодиодного индикатора на кнопке выключения микрофона

dev.acpi_ibm.0.fan - выбрать, хотите ли вы сами управлять скоростью вращения вентилятора (0) или оставить настройки по умолчанию от производителя (1)

dev.acpi_ibm.0.fan_level
- если вентилятор работает, установить скорость вращения

dev.acpi_ibm.0.fan_speed - показывает текущую скорость вращения (в RPM - оборотах в минуту)

dev.acpi_ibm.0.wlan - включить/выключить WiFi (если он включен в BIOS)

dev.acpi_ibm.0.bluetooth - включить/выключить Bluetooth (если он включен в BIOS)

dev.acpi_ibm.0.thinklight - включить/выключить Thinklight

dev.acpi_ibm.0.mute - включить/выключить звук в динамиках

dev.acpi_ibm.0.volume
- уровень громкости динамиков

dev.acpi_ibm.0.lcd_brightness - яркость экрана


В большинстве случаев настройка этих параметров не требуется, так как можно использовать определённые производителем сочетания клавиш (обычно включающие клавишу Fn) или соответствующие кнопки. Но иногда нужны индивидуальные настройки, свои сочетания клавиш или контроль скорости вращения вентилятора в зависимости от температуры процессора - в таких случаях параметры вам и пригодятся.

Например, мне недавно показалось, что вентилятор работает слишком шумно, и я написал скрипт для cron(8) на базе скрипта acpi-thinkpad-fan.sh, чтобы при понижении температуры процессора вентилятор снижал обороты. Этот скрипт я выкладываю здесь - возможно, он будет полезен вам. Вкратце он делает следующее: отключает вентилятор, если температура процессора ниже 50°C; если температура в диапазоне 50-60 градусов, значение скорости устанавливается в '1'; при превышении 60°C значение скорости устанавливается в '3'.

#! /bin/sh

if ! kldstat | grep -q acpi_ibm.ko
then
  doas kldload acpi_ibm
fi

doas sysctl dev.acpi_ibm.0.fan=0 1> /dev/null

TEMP=$( sysctl -n hw.acpi.thermal.tz0.temperature | awk -F'.' '{print $1}' )

if [ ${TEMP} -lt 50 ]
then
  doas sysctl dev.acpi_ibm.0.fan_level=0 1> /dev/null
  exit 0
fi

if [ ${TEMP} -lt 60 ]
then
  doas sysctl dev.acpi_ibm.0.fan_level=1 1> /dev/null
  exit 0
fi

if [ ${TEMP} -ge 60 ]
then
  doas sysctl dev.acpi_ibm.0.fan_level=3 1> /dev/null
  exit 0
fi


А вот пункт в таблице crontab(5):

% crontab -l
# ACPI/IBM/FAN
* * * * * ~/scripts/acpi-thinkpad-fan.s



◆ СЕТЕВЫЕ ИНТЕРФЕЙСЫ


Если драйвер поддерживает энергосбережение для сетевой карты, его можно включить командой ifconfig(8), передав ей параметр powersave:


# ifconfig wlan0 powersave

Я использую его в своём скрипте для управления настройками сети network.sh, который подробно описан в статье по ссылке:  https://vermaden.wordpress.com/2018/03/24/freebsd-network-management-with-network-sh-script/

◆ УТИЛИТЫ ПРОИЗВОДИТЕЛЕЙ


Во FreeBSD доступны также утилиты производителей, такие как powermon(8). Для её работы требуется модуль ядра cpuctl(4).


# pkg install powermon
# kldload cpuctl
# powermon

                  Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
                      (Arch: Sandy Bridge, Limit: 44W)



   5.11W [=======>                                                           ]



 Package:           Uncore:             x86 Cores:          GPU:
 Current: 5.11W     Current: 3.17W      Current: 1.73W      Current: 0.21W
 Total: 98.33J      Total: 60.86J       Total: 33.49J       Total: 3.98J



◆ D-TRACE


Фреймворк динамической трассировки, который, как и ZFS, пришёл во FreeBSD из Solaris/Illumos, также может оказаться полезен в борьбе за увеличение времени работы от батареи.

Для начала его надо установить:

# pkg install dtrace-toolkit

Ваша система выходит из режима энергосбережения или активизирует процессор, когда требуется выполнить какую-то задачу. Чтобы посмотреть список выполняемых процессов, обычно используются ps(1) или top(1), но они не показывают, что именно запускается в данный момент или как часто выполняется какой-либо процесс. В этом вам поможет DTrace.

Воспользуемся скриптом /usr/share/dtrace/toolkit/execsnoop из пакета dtrace-toolkit. Он выводит ВСЕ ВЫПОЛНЯЕМЫЕ КОМАНДЫ со всеми аргументами. Если в данный момент ничего не выполняется, вывод будет пустым.

Вот пример вывода при обновлении показаний моей панели dzen2:

# /usr/local/share/dtrace-toolkit/execsnoop

  UID    PID   PPID ARGS
 1000  97748  97509 /usr/local/bin/zsh -c ~/scripts/dzen2-update.sh > ~/.dzen2-fifo
 1000  97748      1 /bin/sh /home/vermaden/scripts/dzen2-update.sh
 1000  99157  97748 sysctl -n kern.smp.cpus
 1000    311  97748 ps ax -o %cpu,rss,command -c
 1000   3118   1521 awk -v SMP=200 /\ idle$/ {printf("%.1f%%",SMP-$1)}
 1000   4462  97748 date +%Y/%m/%d/%a/%H:%M
 1000   4801  97748 sysctl -n dev.cpu.0.freq
 1000   6009  97748 sysctl -n hw.acpi.thermal.tz0.temperature
 1000   6728  97748 sysctl -n vm.stats.vm.v_inactive_count
 1000   7043  97748 sysctl -n vm.stats.vm.v_free_count
 1000   7482  97748 sysctl -n vm.stats.vm.v_cache_count
 1000  10363   8568 bc -l
 1000  10863  10363 dc -x
 1000  13143   7773 grep --color -q ^\.
 1000  13798  97748 /bin/sh /home/vermaden/scripts/__conky_if_ip.sh
 1000  15089  14235 ifconfig -u
 1000  16439  14235 grep -v 127.0.0.1
 1000  17738  14235 grep -c inet
 1000  19069  18612 ifconfig -l -u
 1000  19927  18612 sed s/lo0//g
 1000  20772  13798 ifconfig wlan0
 1000  23388  21410 grep ssid
 1000  24588  13798 grep -q "
 1000  25965  25282 awk /ssid/ {print $2}
 1000  27917  27217 awk /inet / {print $2}
 1000  29941  97748 /bin/sh /home/vermaden/scripts/__conky_if_gw.sh
 1000  32808  31412 route -n -4 -v get default
 1000  34012  31412 awk END{print $2}
 1000  34895  97748 /bin/sh /home/vermaden/scripts/__conky_if_dns.sh
 1000  36118  34895 awk /^nameserver/ {print $2; exit} /etc/resolv.conf
 1000  37628  97748 /bin/sh /home/vermaden/scripts/__conky_if_ping.sh dzen2
 1000  38829  37628 ping -c 1 -s 0 -t 1 -q 9.9.9.9
 1000  42079  41566 mixer -s vol
 1000  42177  41566 awk -F : {printf("%s",$2)}
 1000  44434  43254 zfs list -H -d 0 -o name,avail
 1000  45866  43254 awk {printf("%s/%s ",$1,$2)}
 1000  47004  97748 /bin/sh /home/vermaden/scripts/__conky_battery_separate.sh dzen2
 1000  48282  47004 sysctl -n hw.acpi.battery.units
 1000  49494  47004 sysctl -n hw.acpi.battery.life
 1000  49948  47004 sysctl -n hw.acpi.acline
 1000  52073  51441 acpiconf -i 0
 1000  53055  51441 awk /^State:/ {print $2}
 1000  53981  53186 acpiconf -i 0
 1000  55354  53186 awk /^Remaining capacity:/ {print $3}
 1000  55968  55631 acpiconf -i 1
 1000  57187  55631 awk /^State:/ {print $2}
 1000  58405  57471 acpiconf -i 1
 1000  59201  57471 awk /^Remaining capacity:/ {print $3}
 1000  60961  59252 bsdgrep -v -E (COMMAND|idle)$
 1000  63534  59252 head -3
 1000  62194  59252 sort -r -n
 1000  64629  59252 awk {printf("%s/%d%%/%.1fGB ",$3,$1,$2/1024/1024)}
 1000  64634  93198 tail -1 /home/vermaden/.dzen2-fifo

Сколько процессов выполняется, чтобы просто обновить значения на панели! Вот поэтому я обновляю информацию на dzen2 раз в пять минут, а если мне нужны точные показания и статус системы на данный момент, то щёлкаю мышью по панели, и она запускает все эти команды.

Используя DTrace таким образом, вы узнаете о ненужных процессах, сокращающих время работы от батареи. Конфигурацию dzen2 вы можете найти в моей статье о freebsd на десктопе по ссылке:   https://vermaden.wordpress.com/2018/07/05/freebsd-desktop-part-13-configuration-dzen2/

◆ ZFS

По умолчанию ZFS пишет группу транзакций каждые 5 секунд, и это подходящее значение для параметра  vfs.zfs.txg.timeout. При необходимости значение можно немного увеличить - например, до 10 секунд. Я упомянул этот параметр, потому что во многих руководствах из соображений производительности рекомендуется устанавливать его в 1, но имейте в виду, что значение 1 не даст вашему диску (и процессору) переходить в спящий режим, что сократит время работы от батареи.

Если хотите поэкспериментировать со значением параметра vfs.zfs.txg.timeout, его значение задаётся в файле /boot/loader.conf.

    ◆ ПРИЛОЖЕНИЯ

Время работы от батареи сильно зависит также от используемых приложений. Например, Thunar потребляет меньше процессорного времени, чем Caja или Nautilus. Текстовый редактор Geany потребляет меньше ресурсов ЦПУ и памяти, чем Scite, Gedit или даже GVim. Не говоря уже о том, что настроенный под себя Openbox/Fluxbox/${ваш_любимый_оконный_менеджер} будет потреблять намного меньше процессорного времени, чем среда рабочего стола типа GNOME или MATE.

    ◆ ОБОРУДОВАНИЕ

Иногда есть возможность в буквальном смысле купить больше времени работы от батареи. Например, если вы собрались покупать новый SSD для ноутбука, выбирайте не самый быстрый, а самый энергоэффективный - разницу в производительности вы, вероятно, всё равно не заметите, но оцените то, что батарея будет медленней разряжаться. 

Большинство модулей оперативной памяти имеют напряжение питания 1,5 В, но есть вероятность, что ваш ноутбук поддерживает маломощные модули DDR с напряжением питания 1,35 В, что увеличит время работы от батареи. Также имейте в виду, что каждая планка потребляет примерно 0,5-1 Ватт, поэтому, если использовать один модуль на 8 Гб, она будет потреблять меньше, чем две по 4 Гб. Хотя это снизит производительность, потому что с одним модулем памяти не получится использовать двухканальный режим, и память будет работать медленней. В некоторых ноутбуках (ThinkPad W520, например) четыре слота для памяти, и можно использовать две планки по 8 Гб вместо четырёх по 4 Гб, что позволить дольше работать от батареи без потери производительности.

Иногда есть возможность вместо DVD-привода поставить дополнительную батарею - например, в ноутбуках  Dell Latitude D630, ThinkPad T420s или ThinkPad T500/W500. У некоторых ноутбуков есть тонкие дополнительные аккумуляторы (slice battery), которые крепятся к нижней крышке - это ThinkPad X220 или T420/T520/W520, а из первого поколения - ThinkPad X1.

Надеюсь, эта информация поможет вам сэкономить время работы от батареи или хотя бы немного электроэнергии.

    ◆ ВИДЕОКАРТЫ И ЭНЕРГОСБЕРЕЖЕНИЕ

Если у вас установлен пакет graphics/drm-kmod, то, скорее всего, у вас драйвер i915kms.ko последней версии.

Чтобы настроить интегрированную видеокарту Intel на максимальное энергосбережение, вставьте в файл /boot/loader.conf следующие строки:


# INTEL DRM WITH graphics/drm-kmod PACKAGE (NEW)
# SKIP UNNECESSARY MODE SETS AT BOOT TIME 
  compat.linuxkpi.fastboot=1
# USE SEMAPHORES FOR INTER RING SYNC
  compat.linuxkpi.semaphores=1
# ENABLE POWER SAVING RENDER C-STATE 6
  compat.linuxkpi.enable_rc6=7
# ENABLE POWER SAVING DISPLAY C-STATES
  compat.linuxkpi.enable_dc=2
# ENABLE FRAME BUFFER COMPRESSION FOR POWER SAVINGS
  compat.linuxkpi.enable_fbc=1

Раньше были такие настройки, но теперь их нет:

# INTEL DRM WITH graphics/drm-kmod PACKAGE (OLD)
  drm.i915.enable_rc6=7
  drm.i915.semaphores=1
  drm.i915.intel_iommu_enabled=1

    ◆ ТЕМПЕРАТУРА ПРОЦЕССОРОВ AMD

Для процессоров Intel есть модуль coretemp (4), а для AMD - amdtemp (4), который предоставляет дополнительную информацию о температуре.

    ◆ INTEL SPEED SHIFT

Поскольку я пользуюсь FreeBSD на очень приличном, но  древнем ноутбуке ThinkPad W520 2011 года, эта опция для меня загадка, но она может быть полезна тем, у кого машины поновей.

FreeBSD поддерживает технологию intel speed shift для процессоров 6-го поколения, начиная с микроархитектуры  skylake - подробнее можете почитать на странице руководства hwpstate_intel(4). Чтобы воспользоваться технологией, добавьте в файл /boot/loader.conf следующую строку:

machdep.hwpstate_pkg_ctrl=0

Затем в файл /etc/sysctl.conf нужно добавить для каждого потока (не ядра) строки с  нужным вам значением параметра:


dev.hwpstate_intel.N.epp=Y

Здесь N - номер потока. Для двухъядерного процессора с четырьмя потоками получится четыре строки. Если в процессоре 8 ядер и 8 потоков, то должно быть 8 строк.


Параметр "Y" может принимать следующие значения:

    ▪ 0 - максимальная производительность;
    ▪ 50 - среднее между макс. производительностью и макс. энергосбережением;
    ▪ 100 - максимальное энергосбережение.

Чтобы получить максимальное энергосбержение,  надо выстаивить 100 для всех потоков:

dev.hwpstate_intel.0.epp=100
dev.hwpstate_intel.1.epp=100
dev.hwpstate_intel.2.epp=100
dev.hwpstate_intel.3.epp=100
dev.hwpstate_intel.4.epp=100
dev.hwpstate_intel.5.epp=100
dev.hwpstate_intel.6.epp=100
dev.hwpstate_intel.7.epp=100

Можно выставлять разные значения для разных потоков:


dev.hwpstate_intel.0.epp=0
dev.hwpstate_intel.1.epp=50
dev.hwpstate_intel.2.epp=100
dev.hwpstate_intel.3.epp=100
dev.hwpstate_intel.4.epp=100
dev.hwpstate_intel.5.epp=100
dev.hwpstate_intel.6.epp=100
dev.hwpstate_intel.7.epp=100

В идеале используйте макс. энергосбережение при работе от батареи и макс. производительность при работе от сети. Для этого вам понадобится скрипт, выложенный ниже, и демон cron(8).

Скрипт:

#! /bin/sh

case $( sysctl -n hw.acpi.acline ) in

  (0) # BATTERY
    doas sysctl dev.hwpstate_intel.0.epp=100 1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.1.epp=100 1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.2.epp=100 1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.3.epp=100 1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.4.epp=100 1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.5.epp=100 1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.6.epp=100 1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.7.epp=100 1> /dev/null 2> /dev/null
    ;;

  (1) # AC
    doas sysctl dev.hwpstate_intel.0.epp=0   1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.1.epp=0  1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.2.epp=0 1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.3.epp=0 1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.4.epp=0 1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.5.epp=0 1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.6.epp=0 1> /dev/null 2> /dev/null
    doas sysctl dev.hwpstate_intel.7.epp=0 1> /dev/null 2> /dev/null
    ;;

esac


Строка для crontab:


% crontab -l
# INTEL/SPEED/SHIFT
  * * * * * ~/scripts/acpi-intel-speed-shift.sh

Подразумевается, что у вас есть необходимые права доступа для doas(1). Если вы используете sudo(8), а не doas, внесите изменения в скрипт.

 К сожалению, у меня нет ноутбука, процессор которого поддерживал бы  Intel Speed Shift, поэтому я не знаю, являются ли значения 0 и 50 для первых двух потоков оптимальными. Возможно, лучше выставить 100 для всех потоков для большей экономии энергии. Когда куплю такой ноутбук, я дам знать.







Saturday, May 24, 2025

Оценка потребления памяти в Линукс (RSS и VSZ)

 Оригинал: https://web.archive.org/web/20120520221529/http://emilics.com/blog/article/mconsumption.html


Примечание переводчика: статья написана в 2012 году, когда RSS считался так, как пишет автор. В настоящий момент в выводе программ вроде ps используется PSS, которая обозначается как RSS. Если вы запустите скрипт на питоне, ссылка на который есть в статье, то получите значение, которое совпадает с RSS в современной системе.

В статье рассказывается об объективном методе оценки потребления памяти процессом в Линукс. В Линукс имеется менеджер виртуальной памяти, поэтому определить, сколько памяти потребляет один процесс, не так просто, как многие думают. В статье объясняется, что означает каждый индикатор потребления памяти.

    Вывод для тех, кому некогда читать


Я считаю объективной метрику PSS(Proportional Set Size) для оценки потребления памяти, если ваша линукс-система её поддерживает. Функция на Питоне, приведённая ниже, возвращает PSS для процесса с заданным ID в кибибайтах (1 Kib=1024 байт). Если она не работает, то, вероятно, ваша операционная система не отображает PSS.

import sys, re

def pss_of_process(pid):
    with file('/proc/%s/smaps' % pid) as fp:
        return sum([int(x) for x in re.findall('^Pss:\s+(\d+)', fp.read(), re.M)])

Вот ссылка на скрипт pss.py, который выводит список процессов и значение PSS для них: https://web.archive.org/web/20130227090134/http://emilics.com/media/pub/pss.py
Чтобы увидеть значения PSS для всех запущенных в пространстве пользователя процессов, выполните команду:

% sudo python pss.py

Вывод команды (на машине переводчика):

admin       1116     934  /bin/sh /usr/bin/startx
admin       1160     909  sh /home/admin/wmaker.sh
messagebus   950     737  /usr/bin/dbus-daemon --system
admin       1146     549  /usr/bin/dbus-daemon --syslog --fork --print-pid 5 --print-address 7 --session
admin       3233     481  /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-
admin       1155     459  wmsystemtray
admin       1145     446  dbus-launch --exit-with-session /usr/bin/wmaker
root        1089     371  dhcpcd: [privileged proxy] wlan0 [ip4]
dhcpcd      3138     333  dhcpcd: wlan0 [ip4]
root        1063     318  /sbin/agetty 38400 tty3 linux

Программа распространяется под лицензией BSD.

     Аллегория, чтобы понять идею


В статье объясняется значение трёх индикаторов, которые можно использовать для определения размера потребляемой одним процессом памяти в Линукс. Это VSZ (Virtual Memory Size) - размер виртуальной памяти, RSS (Resident Set Size) - размер резидентной памяти, и PSS (Proportional Set Size) - пропорциональный размер резидентной памяти.

Хоть аналогия будет неточной, давайте рассмотрим следующий пример, чтобы понять смысл индикаторов: три человека живут в одной комнате. Будем считать, что каждый человек - это процесс, а стоимость проживания - потребление памяти. В этой аналогии потребление памяти одним процессом будет соответствовать расходам на оплату комнаты для одного человека.

У каждого жильца свой сотовый телефон, и расходы на сотовую связь они оплачивают отдельно. Все три индикатора -  VSZ, RSS, PSS, - будут учитывать расходы на сотовую связь для каждого индивидуально, здесь проблем нет.

Вместе с комнатой сдаётся гараж, который можно использовать, если за него заплатить. Но у всех троих нет машины, и они им не пользуются. Тем не менее, VSZ будет добавлять всю стоимость гаража каждому в расходы, даже если человек им не пользуется. То есть VSZ - это расходы на проживание, включая все доступные опции, независимо от их фактического потребления. RSS и PSS учитывают только фактические расходы и, соответственно, не будут учитывать стоимость неиспользуемого гаража.

Все трое пользуются одним шлюзом для интернета и кабельным телевидением, поэтому делят затраты между собой. В этом случае RSS будет добавлять полную стоимость интернета и TV каждому жильцу, даже если стоимость поделена между ними. RSS устроен так, чтобы подсчитывать расходы, будто они ни с кем не разделены.

PSS будет добавлять в оплату проживания каждому треть стоимости интернета и телевидения, поскольку счёт делится между всеми жильцами. Эта метрика более объективна, чем RSS, так как учитывает то, что расходы поделены.

Давайте немного усложним аналогию, чтобы понять ограничения для PSS. Один из жильцов много сидит в интернете, а телевизор смотрит мало, поэтому они договорились, что он оплачивает 50% стоимости интернета и 20% телевидения. PSS не учитывает подобные ситуации и просто делит затраты на интернет и телевидение поровну - каждому третью часть.

Я считаю, что PSS - наиболее объективная метрика, хотя у неё есть свои ограничения, и в некоторых ситуация RSS предпочтительней - в случае, если вы хотите узнать, сколько будете платить, если съедете с комнаты и будете жить одни.

    Управление виртуальной памятью


В старые добрые времена узнать количество потребляемой одним процессом памяти для операционных систем типа MS-DOS или µITRON было просто. Однако в современных системах всё сложнее, поскольку они снабжены менеджером виртуальной памяти, который даёт множество преимуществ, но при этом усложняет расчет используемой памяти для одного процесса.

Менеджер виртуальной памяти в Линукс имеет ряд важных функций, связанных с измерением потребления памяти. Прежде чем перейти к их объяснению, давайте посмотрим результат команды ps aux, которая выдаёт информацию о процессах (Прим. переводчика: это вывод с моей машины).


USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   2480  1752 ?        Ss   12:26   0:00 init [3]
root         2  0.0  0.0      0     0 ?        S    12:26   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        I<   12:26   0:00 [rcu_gp]
root         4  0.0  0.0      0     0 ?        I<   12:26   0:00 [rcu_par_gp]
root         5  0.0  0.0      0     0 ?        I<   12:26   0:00 [slub_flushwq]
root         6  0.0  0.0      0     0 ?        I<   12:26   0:00 [netns]
root         8  0.0  0.0      0     0 ?        I<   12:26   0:00 [kworker/0:0H-events_highpri]
root        10  0.0  0.0      0     0 ?        I<   12:26   0:00 [mm_percpu_wq]


В странице руководства man ps написано следующее:

RSS - объём резидентной памяти - памяти, которую использует процесс, не считая выгруженной в своп. Алиас rsz.

VSZ - объём виртуальной памяти процесса в кибибайтах. Device mapper на данный момент не учитывается, алиас vsz.

Какую метрику использовать: RSS или VSZ? Далее будет объяснено, как работают оба эти индикатора,  а также PSS (Proportional Set Size). Команда ps не отображает PSS, но его можно найти в файловой системе /proc.*
 *Примечание переводчика: конкретно в /proc/$pid/status, где оно называется теперь RSS.

Технические термины: 

Страница - блок памяти, которым оперирует менеджер памяти в Линукс. Как правило, её размер составляет 4096 байт.

Физическая память - реальная память - как правило, RAM, - которая имеется в компьютере.

Виртуальная память - память, выделяемая под процесс. Процесс считает, что у него своя собственная непрерывная память, изолированная от других процессов, независимо от объёма физической памяти компьютера и от того, сколько ещё процессов на неё претендуют. Страницы виртуальной памяти отображаются в физические страницы и, таким образом, процессы оперируют только виртуальной памятью.

    VSZ и Demand Paging


Использовать метрику vsz для измерения памяти, потребляемой процессом, не имеет особого смысла из-за функции Demand Paging - загрузка страниц в память при обращении к ним, - которая предотвращает ненужное потребление памяти.

Например, функционал текстового редактора emacs позволяет работать с XML-файлами. Однако, большую часть времени эта функция не используется, поэтому нет смысла загружать её в физическую память, если пользователю надо отредактировать обычный текст. Demand Paging не даёт загружать страницы, к которым процесс не обращается. Функция работает следующим образом: при запуске программы Линукс выделяет процессу виртуальную память, но не загружает в физическую память страницы, к которым она не обращается в данный момент. Когда программа вызывает функцию из виртуальной памяти, модуль управления памятью процессора - MMU - сообщает ОС, что страница не загружена. Тогда Линукс приостанавливает выполнение процесса, загружает страницу в физическую память, после чего снова запускает процесс. При этом процессу не нужно знать, что он был приостановлен - он просто полагает, что функция загружена в память, и использует её.

VSZ (virtual memory size) показывает размер всей виртуальной памяти процесса, независимо от того, загружены страницы в физическую память или нет. Таким образом, это не объективный показатель потребления памяти, включающий в себя фактически не используемые страницы.

     RSS (Resident Set Size) и разделяемые библиотеки


RSS показывает общее количество страниц процесса, загруженных в физическую память. Может показаться, что это и есть настоящий объём потребляемой процессом памяти, и что эта метрика лучше, чем VSZ, но всё не так просто из-за разделяемых (динамических) библиотек.

Библиотека - это модуль, который программы используют для реализации определённого функционала. Например, libpng.so занимается сжатием и распаковкой изображений в формате PNG, а libxml2.so - обработкой файлов XML. Чтобы программистам каждый раз не писать эти функции, можно пользоваться библиотеками, которые уже написаны.

Разделяемый объект - это библиотека, которой одновременно пользуются несколько программ или процессов. Пусть у нас запущено одновременно два процесса, которым требуется функционал библиотеки libxml2.so. Чтобы не загружать несколько раз одинаковые страницы памяти, Линукс загружает один экземпляр библиотеки в физическую память и отображает его в виртуальную память обоих процессов. Процессам неважно, используют ли они функцию совместно, так как они получают доступ к ней в своей виртуальной памяти. Разделяемые библиотеки позволяют не дублировать страницы в памяти.

А теперь вернёмся к примеру про emacs, который может работать с файлами в формате XML благодаря библиотеке libxml2.so. На этот раз пользователю на самом деле нужно открыть файл XML в emacs, поэтому emacs использует libxml2.so. Тем временем в фоне выполняются ещё два  процесса, использующие ту же библиотеку. Поскольку она разделяемая, Линукс загружает один её экземпляр в физическую память и отображает его в виртуальную память всех трёх процессов.

Если вы посмотрите метрику RSS для emacs, то в неё будут включены страницы libxml2.so. RSS не врёт, потому что emacs действительно её использует, но как насчёт двух других процессов, обращающихся к библиотеке? Если вы сложите RSS всех трёх процессов, то libxml2.so будет учтена три раза, хотя в физическую память загружен только один экземпляр.

Таким образом, RSS - это индикатор для случаев, когда процесс работает один и не использует никаких функций совместно с другими процессами. На практике, где разделяемые библиотеки используются совместно, RSS будет завышать показатель памяти, потребляемой одним процессом. Эту метрику можно использовать для оценки потребления памяти, но надо иметь  в виду данную особенность.

    PSS (Proportional Set Size)


Индикатор PSS используется для измерения объёма памяти, потребляемой одним процессом, который делит объём памяти, потребляемой страницами разделяемых объектов, поровну между процессами, которые их используют. RSS считает объём памяти следующим образом: если N процессов используют одну разделяемую библиотеку, то каждый процесс потребляет часть памяти этой библиотеки, равную 1/N.

Например, emasc и ещё два процесса совместно используют библиотеку libxml2.so. Так как процесса три, то каждый использует  1/3 объёма памяти, занимаемой libxml2.so.

Я считаю, что PSS - более объективный индикатор, чем RSS. Особенно он подходит для учёта памяти, потребляемой всей системой, а не каждым процессом в отдельности. Например, если вы разрабатываете систему со множеством процессов и служб и хотите оценить, сколько памяти надо установить в устройство, то PSS покажет более точный результат, чем RSS.





 

Monday, April 21, 2025

Борьба с техническим прогрессом - остановка парковки головок HDD Toshiba 2.5" HDD MQ01ABD

 Диск был куплен в РФ около года назад. Раньше парковка останавливалась из линукса просто: командой hdparm с параметрами -B 254 или, например, -S 253. На диске с контроллером SATA 2 пока так и есть, но прогресс не стоит на месте, и новые контроллеры стали умнее: они не дадут вам пользовать диск 10 лет и не чихать.

По умолчанию, как обычно, параметр -B был выставлен в 128. К счастью, контроллер его в принципе воспринимает, в отличие от -S, на который никак не реагирует. Но теперь ни 254, ни 252 не отключают парковку полностью - если не запущен браузер, головы паркуются каждые несколько минут. Чтобы от этого избавиться, я отредактировала crontab, заставив систему каждые полсекунды писать, а потом стирать файл - если интервал был больше половины секунды, оно не работало; без выставления hdparm -B 254 тоже не работало. Поначалу всё было нормально: головы перестали парковаться, smart ничего нового не выдавал. Но примерно через три месяца атрибут 5 (reallocated sector count) вдруг показал 24 вместо нуля. При этом pending sector был 0, а reallocated event count - 7. Я сразу запустила команду повторно, чтобы посмотреть, растёт ли атрибут, и он был уже 136. На форумах обычно предлагают выбрасывать такие диски в мусорку, но я уже знала, что контроллер там ё***тый, поэтому полезла в crontab и закомментировала свои художества. После этого атрибут сразу перестал расти: я провела тесты offline и long, все стоит на месте. Прошла пара недель, и ничего не изменилось: reallocated sector count 136; pending sector 0;  reallocated event count 7. Таким образом, скорее всего, дело не в поверхности, а в сраном контроллере.

В общем, остался только один выход: браузер постоянно запущен, причем не на пустой вкладке, чтобы на диск периодически что-то писалось. Так парковка всё равно происходит чаще, чем по-нормальному, но всё-таки не каждые 2 минуты.

UPD

Вот так теперь выглядит мой смарт, срок работы около полугода: 1576 переназначенных секторов, 119 reallocated event, при этом pending sector ноль. Одна бабка сказала, что тошиба, в отличие от WD, переназначает сектора не только при ошибках записи, но и чтения. У них, вроде как, есть таймаут, и, если операция чтения в него не укладывается, происходит переназначение. Почему pending sector count пустой, я не знаю - возможно, контроллер глюкавый. В общем, посмотрю, сколько эта хрень проработает (на полях VALUE и WORST пока не отражается, диск работает быстро и стабильно), но, честно говоря, желания покупать тошибу у меня больше нет.

Wednesday, February 5, 2025

Отзыв о Freebsd 14.2 - сравнение со Slackware 15.0 и Ghostbsd.

 У меня на Слаке стал отваливаться wi-fi (суппликант не проходил авторизацию, никакой секс не помогал), и я решила попробовать freebsd. Сразу скажу, что причина отвала, скорее всего, в битом образе: прежде чем я поставила систему на этот ноут, флешка долго валялась без подключения, и данные, вероятно, пострадали. Та же слака 15.0 на другом ноуте работает как часы.
Установка производилась на новый SSD ёмкостью 240 ГБ на два древних ноута: один HP с графической картой intel и таким же чипсетом, второй Asus с чипсетом и картой Nvidia.
 
В общем, сначала мне было влом ставить голую систему: у фряхи есть образ с графической оболочкой, но там написано, что он для оптического привода (для флешек у них образ memstick), и, кроме того, он больше 4 ГБ (они там все поохуели, блядь, извините), а моя флешка для систем ровно 4 гига. В общем, я сначала попробовала Ghostbsd. Там по умолчанию стоит Mate в качестве рабочего стола - размер образа около двух гигов, - файловая система zfs. Установщик там графический, мне он не понравился, ничего толком выбрать не даёт, - например, или разметка по умолчанию zfs, или сам разбивай, - в общем, параша. Сначала я ставила его на Compaq. Я выбрала разметку диска по умолчанию, там был один слайс на всё и просто пул под названием zroot, ну ещё своп и загрузочный раздел.

Всё поставилось, загрузилось, заработало. Zfs жрёт память как не в себя (UFS тоже жрёт больше, чем линуксовые ext, но меньше, чем это). В общем, перейду сразу к минусам:

1. Я не смогла поднять вайфай - проводная сеть работала, но если бы в ноуте не было соответствующего адаптера, я бы отсосала.
Я пыталась поднять через их менеджер (уже забыла, как он назывался, но не Wifimgr) и руками, но нет.

2. Там как-то по умолчанию ставится так, что ты вообще не видишь аккаунт рута. Я не пользуюсь sudo, только su, и некоторые команды почему-то не могла выполнить. Например, он не выполнял команды администрирования zfs

3. Я хотела добавить пользователя в какую-то группу, а команды pw, сука, просто нет в системе. Я не помню, пыталась ли я поставить её с помощью их менеджера pkg, но жопа у меня подгорела.

4. Я попыталась поставить дрова nvidia из их репозитория так, как было описано в руководстве, но обломалась: эти дрова оказались протухшие (я потом посмотрела: у них версия 2, а во фряхе уже 4), и после перезагрузки я увидела чёрный экран.

Я устанавливала систему на HP, но на Асусе она тоже работала. Правда, когда я попыталась загрузить модуль ядра acpi_asus, она сказала, что этот ноут не поддерживается.

В общем, возможно, что-то ещё меня напрягло, но вот этого мне хватило, чтобы скачать образ фряхи и записать его на флешку.


И вот я запустила bsdinstall сначала на Асусе с Нвидиа. Но она начала громко ругаться: CAM status, CRC Error - короче, ругалась на Sata. Я даже звонила в сервисный центр, обосравшись кирпичами, но мне сказали, что вероятность отвала контроллера Сата почти нулевая: на его веку, говорит, такого не было. Честно говоря, я подумала на диск, но в ноуте с интеловским чипсетом всё прошло нормально.

Установщик очень удобный и интуитивный. Например, когда выбираешь временную зону, сначала появляется меню с континентами, потом - странами, а потом уже города, и не приходится мотать до посинения, чтобы найти свою зону, как в Слаке. Есть варианты разметки диска: дефолт с UFS, дефолт с ZFS, guided partitioning с UFS и руками. При этом, если выбрать guided, можно поставить на раздел диска, не сильно напрягаясь. Я выбрала zfs, так как она, вроде бы, оптимизирована под SSD - там есть Trim, информация размазывается по диску равномерно и всё такое - ну так написано в руководствах. Установщик предложил по умолчанию сделать блок 4 К (ashift 12).

Вот вывод команды zfs list после установки:
    
zroot               12.2G   201G    96K  /zroot
zroot/ROOT          8.55G   201G    96K  none
zroot/ROOT/default  8.55G   201G  8.55G  /
zroot/home          3.61G   201G    96K  /home
zroot/home/admin    3.61G   201G  3.61G  /home/admin
zroot/tmp            860K   201G   860K  /tmp
zroot/usr            288K   201G    96K  /usr
zroot/usr/ports       96K   201G    96K  /usr/ports
zroot/usr/src         96K   201G    96K  /usr/src
zroot/var            744K   201G    96K  /var
zroot/var/audit       96K   201G    96K  /var/audit
zroot/var/crash       96K   201G    96K  /var/crash
zroot/var/log        240K   201G   240K  /var/log
zroot/var/mail       120K   201G   120K  /var/mail
zroot/var/tmp         96K   201G    96K  /var/tmp

В общем, всё поставилось, я установила иксы, потом драйверы для видеокарты. Ну сначала я настроила регулирование частоты процессора и всё такое, но это всё есть в хэндбуке - я просто делала, как там написано. Попробовала набрать startx, и там если не установлен десктоп, то запускается уродский twm. Чтобы из него выйти, надо просто перейти в консоль (Alt+Ctrl+F1) и там нажать Ctrl+c. В общем, я накатила свой любимый fluxbox, запустила его (командой "startx /usr/local/bin/startfluxbox" - во фряхе команды пользователя и их конфиги хранятся в /usr/local), и он заработал. Скажу больше: в Слаке если выбирать темы для флакса, он иногда вылетал после переключения стиля, а здесь я заодно поставила темы - все стили с сайта tenr.de здесь есть в качестве пакета - и долго их дёргала (окно со списком получилось на весь экран - 15,6 дюймов, - и ещё пришлось прокручивать), и, хотя индикатор gkrellm скакал из стороны в сторону, ничего не вылетало.

Также я установила шрифты googlefonts. Настройка шрифтов есть в хендбуке, но могу сказать, что freetype здесь не такой, как в слаке - шрифты выглядят лучше.

Разнообразие программного обеспечения меня полностью устроило: даже бинарных пакетов дофига, а ещё есть порты, причём установка из портов тоже очень простая. Есть браузер Librewolf, которого нет в репозиториях слаки, но зато в слаке есть wps office бинарный, а здесь он только в портах - правда, во фре есть апач опенофис. Есть pipewire, да, в прнципе, всё необходимое есть в бинарном виде. Нет redshift-gtk, но просто redshift работает. То, что я установила, работает стабильно.

Потребление памяти: на старте fluxbox в слаке отжирал где-то 190 МБ по показаниям команды free в терминале sakura. Здесь сразу после запуска то же самое потребляет больше 800 метров по показаниям vmstat - команды free здесь нет. Сейчас у меня запущен терминал, gvim и librewolf c 12  вкладками, и из 3856 M свободы 1666 - так показывает индикатор в gkrellm.

Беспроводную сеть подняла с помощью wpa_cli без всяких плясок с бубном.

Насколько быстро работает: загружается в иксы за пару секунд, вообще всё достаточно быстро. Несмотря на конское потребление памяти, пока ни разу не использовался своп.

А теперь ложка дёгтя: кулер постоянно молотит на высоких оборотах. На форуме пишут, что во фряхе нет управления оборотами вентилятора, которое реализовано в линуксе в lm-sensors.

Мои впечатления: честно говоря, если бы не орущий кулер, я бы вообще не думала, оставить или поменять обратно на слаку. Freebsd 14.2 - огонь.


Wednesday, January 22, 2025

Происхождение выравнивания границ разделов жёсткого диска

оригинал: http://jdebp.info./FGA/disc-partition-alignment.html
 

Зачастую считается, что разделы диска должны быть выровнены по границам цилиндров или дорожек, но на самом деле это не так и никогда так не было. Требования к выравниванию существуют, но они никак не связаны с цилиндрами и не являются обязательными. Операционные системы будут работать с дисками, разделы на которых выровнены неправильно, просто медленней на некоторых моделях устройств.


    Заблуждения о выравнивании по границам дорожек


На первый взгляд, идея о том, что разделы на диске должны быть выровнены по границам цилиндров выглядит абсурдной. Миллионы людей пользовались дисками, на которых первый основной раздел начинался с нулевой дорожки, первого сектора и первой головки, без каких-либо негативных последствий для различных операционных систем, начиная c MS_DOS, затем Windows-NT и заканчивая OS/2. В конце концов, это были значения по умолчанию для утилит fdisk и Disk Manager в течение почти двадцати лет. Максимум утилиты могли потребовать выравнивания внутри дорожек, т.е. чтобы все разделы начинались с первого сектора (помните, что сектора нумеруются с единицы) на любой дорожке.

Но даже этого не было: ни одна операционная система никогда не предъявляла таких требований. Даже MS-DOS прекрасно работала с дисками, разделы которых начинались не с первого сектора. Такие требования выдвигали только утилиты для разбиения дисков. В некотором смысле это был порочный круг: утилиты для работы с диском предъявляли требования к выравниванию разделов, потому что их авторы думали, что того требует система. Но люди думали, что такое требование существует в системе, только потому, что его навязывали утилиты типа fdisk. Умозаключение выглядело так: раз утилиты накладывают такие ограничения, значит, на утилиты их накладывает сама система. Но на самом деле операционные системы ничего подобного не требовали.

Так или иначе, идея выравнивания дорожек безумна. Она не имеет смысла, поскольку это не приводит к выравниванию разделов по каким-либо допустимым границами на самом устройстве. Вы не получите выигрыша в производительности или каких-либо других преимуществ, так как разделы не будут выровнены по границам физических дорожек, если их выровнять по тем дорожкам, которые видят программы.

▪ "Дорожки", которое системное ПО видит на уровне регистра команд контроллера интерфейса ATA, не совпадают с реальными дорожками на поверхности диска с тех пор, как появилась ZBR (зональная побитовая запись). На самом деле дорожки на дисках с ZBR имеют разную физическую длину, хотя через старый командный интерфейс с адресацией цилиндр+головка+сектор на дисках ATA они представлялись программам одинаковыми.

▪ В отличие от контроллеров ATA, управляющий интерфейс SCSI всегда оперировал логическими адресами блоков, а не кортежами цилиндр+головка+сектор (CHS). Для контроллеров SCSI с самого начала была неприменима идея о том, что системное ПО обязано различать границы физических дорожек. Вообще-то разработчики контроллеров интерфейса SCSI для персональных компьютеров вынуждены были изобретать геометрию диска, беря её с потолка, ради прошивок PC/AT и PC98,  а также операционных систем, которые ожидали, что контроллеры интерфейса дисков будут оперировать геометрией CHS.

В 2008 г. Микрософт с большой помпой наконец искоренили эту совершенно бесполезную и бессмысленную идею из диспетчера дисков Windows NT (т.е. в релизах Windows Vista Service Pack 1 и Windows Server 2008). До этого, начиная с 2003 года, администраторам Exchange server и Microsoft SQL Server рекомендовалось использовать diskpart и устанавливать границы разделов кратными 4 кибибайтам из соображений улучшения производительности. Хотя некоторые из этих соображений были основаны на ложной посылке, что границы дорожек, которые видят программы, совпадают с физическими границами, тем не менее, в свете более поздней разработки оборудования, они дали ожидаемый результат.

Linux отстал от Windows, и по состоянию на 2011 год утилита fdisk продолжала жаловаться на то, что разделы не выровнены по границам дорожек. Поэтому настоятельно рекомендуется не пользоваться fdisk для разметки, заменив её более современными инструментами, такими как gdisk Рода Смита, у которого также есть преимущество в виде поддержки схемы разметки дисков EFI.


    Выравнивание границ кратно 4 KiB


Правило выравнивания границ разделов дисков, отражающее реальные физические границы, существует - это правило выравнивания  по границам 4 KiB, но оно применимо не ко всем моделям жестких дисков.

В некоторых моделях внутренний размер сектора был увеличен с 0.5 Kib до 4 Kib (физический сектор). Однако на уровне контроллера интерфейса, через который системное ПО общается с диском, размер сектора остался 0.5 Kib. Такие диски называются 512-байтовыми эмуляционными носителями. При этом предполагается, что будут и диски без эмуляции, у которых размер логического сектора также будет равен 4 KiB. Но, поскольку на данный момент очень немногие операционные системы поддерживают размер сектора, не равный 512 байтам, на уровне стандартных команд ATA/SCSI, то и пользователей таких носителей немного, и они не представляют большого потребительского рынка для производителей жестких дисков.

512-байтовые эмуляционные диски работают следующим образом: каждый раз, когда операционная система или прошивка считывает 0.5 KiB, само устройство считывает 4 KiB, делит это число на восемь и передаёт ОС или прошивке результат деления. Когда система/прошивка записывают сектор 0.5 KiB, диск фактически считывает весь физический сектор 4 KiB, модифицирует данные на его восьмой части и записывает весь сектор 4 KiB.

Может показаться, что это сильно снижает производительность, так как по сути каждая операция ввода-вывода оперирует размером данных в восемь раз больше видимого размера. К счастью, существует способ скрыть эти потери производительности: многие операционные системы всё равно предпочитают выполнять основную часть операций ввода-вывода над блоками, размеры которых кратны 4 KiB. Например, вся подкачка страниц на системах архитектуры x86 выполняется блоками, кратными 4 KiB. Кроме того, многие операционные системы, включая Windows NT и Solaris, используют механизм подкачки для обычного файлового ввода-вывода. Таким образом, обычно операционная система за одну операцию ввода-вывода считывает и записывает блоки, кратные восьми секторам размера 0.5 KiB.

Поэтому нужно, чтобы эти блоки непрерывно следовали друг за другом, и их границы совпадали с границами физических секторов диска, размер которых 4 KiB. "Естественные" границы блоков файловой системы должны совпадать со скрытыми границами секторов внутри диска. Восемь секторов по 0.5 KiB, которыми оперируют команды системы, не должны растягиваться на два или более физических сектора по 4 KiB - они должны составлять ровно один сектор и внутри этого сектора располагаться в правильном порядке.

Стоит заметить, что некоторые пользователи, измерившие падение производительности, вызванное тем, что разделы на 512-эмуляционных дисках не были выровнены по границе 4 KiB, с удивлением обнаружили, что производительность снизилась довольно существенно. Забавно, что цифры, которые они получили, были меньше, чем те восемь раз, которые теоретически должны возникнуть из-за того, что каждый запрос к 0.5 KiB превращается в запрос к 4 KiB, так что они наоборот должны были удивиться тому, насколько малым оказалось это снижение. Причиной того, что на практике производительность падает не так сильно, является кластеризация, как её принято называть в мире BSD - по крайней мере, в контексте подкачки при операциях ввода-вывода. При кластеризации несколько отдельных запросов на чтение/запись к смежным блокам диска объединяются в один, охватывающий все блоки в одной команде ввода-вывода, передаваемой устройству хранения данных. Это позволяет снизить количество обращений контроллера к секторам по 4 KiB и таким образом снижает накладные расходы.

Выравнивание по границам, кратным 4 KiB, достигается тремя способами:

    ▪ Выравнивание границ разделов по 4 KiB относительно начала диска: номер сектора начала и конца каждого раздела представляет собой целое число, кратное 4 KiB от начала диска.
    ▪ Выравнивание структур данных внутри тома по границам 4 KiB относительно начала раздела. Если формат тома использует концепцию зон (групп цилиндров и т.п.), как это бывает на томах с файловыми системами UFS или Ext2/3/4, эти зоны должны иметь целочисленный размер, кратный 4 KiB. Файловые системы FAT и NTFS не оперируют зонами, но при форматировании раздела в FAT общий размер файловых таблиц и зарезервированных секторов в начале тома должен быть целым и кратным 4 KiB, так чтобы кластеры с данными, следующие за ними, также были выровнены по границам, кратным 4 KiB.
    ▪ Целочисленный размер кластера файловой системы - логической единицы хранения данных, - кратный 4KiB.

На самом деле, как подметил Род Смит в своей статье ( http://rodsbooks.com./gdisk/advice.html#alignment), утилиты разметки дисков от Microsoft в настоящее время (2011 год) по умолчанию выравнивают границы разделов кратно 1MiB, что не имеет под собой никаких оснований. Времена, когда 1 Mib можно было рассматривать как (32 сектора) х (64 головки), давно прошли. Хотя по причинам, описанным выше, такой подход не имел смысла даже в то время, поскольку эта геометрия не соответствовала физической геометрии самого диска. Единственная причина использования для выравнивания размера 1 MiB вместо 4 KiB, который действительно соответствует физическому размеру сектора внутри диска, заключается в том, что при таком размере утилиты, отображающие положение и размер дисковых разделов в Мебибайтах, показывают целые числа. Иными словами, измерение границ и размеров разделов в единицах по 4 KiB оказалось излишне точным для пользователей, которые обычно не работают с разделами меньше Гибибайта при разметке диска.

    Выравнивание разделов на дисках, размеченных старыми утилитами


К сожалению, версии утилит fdisk и Disk Msnsger от Microsoft, которые были до 2008 года, а также текущая версия fdisk в линукс (текущая - это на 2011 год) по умолчанию не выравнивали границы разделов кратно 4 KiB по той простой причине, что (фальшивая) геометрия, которую использовало большинство дисков (размером больше 7,87GB, разумеется) предполагала, что на дорожке 63 сектора. Поэтому те старые глупые утилиты выравнивали разделы кратно шестидесяти трём секторам. Они начинали первый основной раздел с нулевого цилиндра, первой головки, первого сектора, а номер логического блока диска был 63, и весь раздел выравнивался по нечётному номеру сектора.

Таким образом, диски, размеченные старыми версиями утилит, надо переразбить, скорректировав размеры разделов. Границы разделов нужно сдвинуть в большую или меньшую сторону, так чтобы они начинались с целых чисел, кратных 4 KiB или  1 MiB. Если они были выровнены с учётом того, что на дорожке 63 сектора, то обычно между разделами или в начале/конце диска, если диск разбит с таблицей MBR, есть свободное место, чтобы выровнять разделы кратно 4 KiB. Это довольно длительный процесс, так как надо считать, а затем записать данные с каждого сектора на всех разделах, границы которых будут сдвигаться.















Monday, August 12, 2024

Использование Wireshark: доступное руководство и советы.

 Оригинал: https://www.varonis.com/blog/how-to-use-wireshark

Использование Wireshark: доступное руководство и советы.


Если вы занимаетесь устранением неполадок в сети, и вам нужно анализировать отдельные пакеты, вам необходим Wireshark - приложение для захвата и анализа сетевого трафика, которым вы должны уметь пользоваться. Поскольку Wireshark - наиболее распространённый инструмент для этих целей, давайте рассмотрим основы его применения: где его взять, как захватывать пакеты, как пользоваться фильтрами и т.д.

    ▪ Что такое Wireshark?


Это программа для анализа сетевых протоколов с открытым исходным кодом, которую часто считают отраслевым стандартом. Wireshark поддерживается международной организацией специалистов по сетям и разработчиков ПО, поэтому к ней постоянно выпускаются обновления с учётом новых сетевых технологий и методов шифрования.

Правительственные учреждения, корпорации, некоммерческие организации и образовательные учреждения используют Wireshark для устранения неполадок и обучения - действительно, разглядывать трафик под микроскопом Wireshark - лучший способ изучить сети на низком уровне.

Использовать Wireshark можно, только если вам разрешили анализировать трафик: просмотр пакетов без разрешения незаконен.



    ▪  Как работает Wireshark?


Wireshark - это сниффер, т.е. инструмент отслеживания и анализа сетевого трафика. Он перехватывает трафик протоколов ethernet, bluetooth, 802.11, token ring, frame relay и других и сохраняет данные для последующего анализа.

Примечание редактора 1: под пакетом подразумевается единица передачи данных протоколов, начиная с сетевого уровня (TCP, DNS и т.д.)

Примечание редактора 2: В локальной сети трафик широковещательный, то есть компьютер с wireshark может видеть трафик между двумя другими компьютерами. Чтобы увидеть, какой трафик отправляется на внешний сайт, надо перехватить пакеты на локальном компьютере.


Wireshark позволяет устанавливать фильтры на логирование перед захватом трафика либо во время его анализа, чтобы можно было сосредоточиться на том, что вам нужно найти, при трассировке. Например, можно установить фильтр для просмотра трафика протокола TCP между двумя IP-адресами; либо можно настроить отображение только пакетов, отправляемых с какого-то одного компьютера. Наличие фильтров стало одной из основных причин того, что что он стал стандартным инструментом анализа пакетов.


    ▪ В каких случаях следует использовать Wireshark?


Wireshark можно использовать для понимания того, как происходит обмен трафиком в сети, и для анализа причин проблем со связью.

Утилита помогает:

▶ Сетевым администраторам решать возникающие в сети проблемы

▶ Инженерам сетевой безопасности изучать сеть на наличие дыр в безопасности

▶ Тестировать приложения

▶ Разработчикам в отладке реализаций протоколов

▶ Пользователям изучать специфику отдельных протоколов


    ▪ В каких случаях не следует использовать Wireshark?


Wireshark может быть полезен в решении множества проблем в сети, а также в качестве инструмента изучения протоколов, но он не может:

▶ Помочь пользователям, которые не разбираются в сетевых протоколах: чтобы пользоваться утилитой, нужно понимать, как работают сети

▶ Перехватывать трафик за пределами вашего широковещательного домена

▶ Присылать уведомления: он может только применить цветовое кодирование для индикации битых пакетов


    ▪ Как установить Wireshark


Это несложно: сначала нужно посетить официальный сайт Wireshark: https://www.wireshark.org/download.html и загрузить версию программы для вашей операционной системы. Базовая версия бесплатна, установка простая.

    Wireshark на Windows


Для Windows  есть два варианта приложения: 64-битное и 32-битное. Выберите тот, который совместим с вашей ОС.

    Wireshark на Mac


https://www.wireshark.org/docs/wsug_html_chunked/ChBuildInstallOSXInstall.html : Wireshark можно установить с помощью менеджера пакетов Homebrew  https://formulae.brew.sh/cask/wireshark#default . Чтобы установить Homebrew, наберите в терминале следующую строку:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

После установке Homebrew вы сможете устанавливать различные open-source программы на макбук. Для установки wireshark наберите в терминале:

brew install wireshark

Homebrew загрузит и установит пакет вместе с зависимостями.

   Wireshark на Linux


Процесс установки может зависеть от дистрибутива.

Ubuntu: наберите в терминале следующие команды:
    

    sudo apt-get install wireshark

    sudo dpkg-reconfigure wireshark-common

    sudo adduser $USER wireshark


Пакет будет загружен, обновлён, и ваш пользователь получит права на запуск Wireshark.


RHEL, Fedora:


    sudo dnf install wireshark-qt

    sudo usermod -a -G wireshark username

Первая команда устанавливает графический и командный интерфейсы программы, а вторая даёт пользователю права запускать Wireshark.

Kali Linux:

Скорее всего, пакет уже установлен, так как является частью основной системы. Попробуйте найти его в меню "Sniffing & Spoofing"


    ▪ Пакеты данных в Wireshark


Мы установили программу, а теперь узнаем, как включить сниффер и анализировать сетевой трафик. Wireshark расскажет, что происходит в сети, но не объяснит, почему.

    ▪ Перехват пакетов с помощью Wireshark


Открыв окно программы, вы увидите список всех сетевых соединений, доступных для мониторинга, а также строку фильтра, чтобы выделить трафик, который вам нужен: https://info.varonis.com/hubfs/using-wireshark-capture-filter-1@2x-png.png

Можно выбрать один или несколько сетевых интерфейсов с помощью shift+left-click. После этого можете начинать перехват трафика. Это можно сделать несколькими способами:

1. Нажать первую кнопку на панели, при наведении на которую всплывает её назначение: "start capturing packets".

https://info.varonis.com/hubfs/using-wireshark-start-capturing-2@2x-png.png

2. Через пункт меню Capture --> Start: https://info.varonis.com/hubfs/using-wireshark-capturing-packets-3@2x-png.png

3. Используя сочетание клавиш Control+e

Во время перехвата wireshark будет отображать перехваченные пакеты в реальном времени:

https://info.varonis.com/hubfs/using-wireshark-stop-capture-4@2x-png.png

Когда получите все нужные вам пакеты, закончите перехват, нажав кнопку "stop capturing packets" на панели, выбрав  соответствующий пункт в меню или сочетаниями клавиш Control+e или Control+c. Перехват рекомендуется закончить, прежде чем начать анализ трафика.

    ▪ Анализ пакетов с помощью Wireshark


Инструмент предоставляет три панели для анализа пакетов. Верхняя - список пакетов (Packet List). В ней отображаются все перехваченные пакеты. Если кликнуть на пакет, в двух остальных панелях отображается подробная информация о нём, в том числе можно определить, является ли он частью сеанса. Значение столбцов верхней панели:

1. No.: Порядковый номер перехваченного пакета. Квадратные скобки означают, что пакет - часть сессии.
2. Time: Время в секундах, прошедшее с момента начала перехвата до момента, когда был перехвачен конкретный пакет. Значение этого поля можно редактировать в меню настроек.
3. Source: Адрес системы, отправившей пакет.
4. Destination: Адрес получателя пакета.
5. Protocol: Тип пакета - например, TCP, DNS, DHCP, ARP.
6. Lenght: Длина пакета в байтах.
7. Info: дополнительная информация о содержимом пакета. Значение поля зависит от типа протокола пакета.

Средняя панель - это Packet details (сведения о пакете), в ней отображается как можно более полная информация о пакете, в зависимости от типа его протокола. Выделив текст в этой панели, можно нажать правую кнопку мыши и настроить фильтры.

Нижняя панель - Packet Bytes - байты пакета, - отображает пакет в шестнадцатеричном формате, как он выглядел, когда был перехвачен.

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

    ▪ Фильтры Wireshark


Одни из наиболее полезных возможностей программы - это фильтры захвата и отображения. Фильтры позволяют при просмотре захвата выделить то, что необходимо вам для устранения неполадок. Для начала приведём некоторые из них.

            1. Фильтры захвата    

Они ограничивают программу в момент захвата пакетов: если пакет не проходит фильтр, wireshark не будет его сохранять. Примеры фильтров захвата:

host IP-address: перехватывать только пакеты, отправителем или получателем которых является хост с указанным адресом.

net 192.168.0.0/24: перехватывать весь трафик подсети.

dst host IP-address: перехватывать пакеты, предназначенные для узла с указанным адресом.

port 53: перехватывать только трафик порта 53.

port not 53 and not arp: перехватывать весь трафик, кроме пакетов протоколов DNS и ARP.

            2. Фильтры отображения

Страница руководства: https://wiki.wireshark.org/DisplayFilters

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

Вот один из наиболее полезных фильтров:

ip.src==IP-address and ip.dst==IP-address

Он показывает пакеты, отправленные с одного узла (ip.src) другому (ip.dst). Можно также отображать пакеты, которые отправляет и принимает хост с указанным IP.

Также имеются следующие фильтры:

tcp.port eq 25: Показывает весь трафик на 25 порту - обычно это SMTP.

icmp: Показывает только трафик протокола ICMP - скорее всего это пинги.

ip.addr!=IP_address: показывает весь трафик, кроме входящего и исходящего на указанном адресе.

Аналитики даже создают фильтры для обнаружения определённых атак - например, этот фильтр используется для обнаружения червя Sasser:

ls_ads.opnum==0x09


    ▪ Дополнительные функции Wireshark


Помимо перехвата и фильтрации, у программы есть функции, которые могут упростить вам работу.

            1. Варианты выделения цветом

Wireshark  можно настроить, чтобы пакеты в списке выделялись определённым цветом в зависимости от фильтра. Примеры применения функции можно найти по ссылке: https://wiki.wireshark.org/ColoringRules    

            2. Promicuous mode (неразборчивый режим)

По умолчанию wireshark перехватывает только исходящие и входящие пакеты хоста, на котором он запущен. Поставив флаг promicuous mode в пункте меню capture settings, можно перехватывать почти весь трафик подсети.

            3. Командная строка wireshark

Страница руководства: https://www.wireshark.org/docs/wsug_html_chunked/ChCustCommandLine.html

Программа предоставляет интерфейс командной строки (CLI), если на вашей системе отсутствует графический интерфейс. Лучше всего использовать CLI для захвата и сохранения логов, а потом просмотреть их в графическом интерфейсе.

Команды wireshark:

    wireshark : запустить Wireshark в графическом режиме

    wireshark –h : показать доступные параметры команды wireshark

    wireshark –a duration:300 –i eth1 –w wireshark. : перехватывать трафик на проводном интерфейсе eth1 в течение пяти минут. -a означает автоматическое прекращение перехвата; -i указывает, на каком интерфейсе перехватывать.

            4. Метрики и статистика

В меню Statistics есть множество опций для просмотра подробностей перехвата.

Изображение: https://info.varonis.com/hubfs/using-wireshark-statistics-6@2x-png.png

свойства файла, куда сохранились перехваченные данные: https://info.varonis.com/hubfs/using-wireshark-capture-file-properties-7@2x-png.png

График ввода-вывода программы: https://info.varonis.com/hubfs/using-wireshark-io-graph-8@2x-png.png


    ▪ Дополнительные источники и руководства по Wireshark


Есть много руководств и видеороликов, показывающих, как использовать wireshark для определённых целей. Начать следует с сайта Wireshark, а потом продвигаться дальше. На сайте вы можете найти официальную документацию (https://www.wireshark.org/docs/wsug_html_chunked/index.html) и вики (https://wiki.wireshark.org/).    

Wireshark - прекрасный сниффер и инструмент анализа пакетов, но лучше всего пользоваться им, когда вы понимаете, что ищете. Программа не подойдёт для обнаружения новой проблемы, так как в сети слишком много шума. Инструменты Varonis и Edge помогут разобраться в ситуации и указать, какую угрозу искать, после чего можно использовать wireshark, для более глубокого анализа и определения угрозы, которую представляет собой тот или иной пакет.

Хорошим примером может служить случай, когда исследователи безопасности Varonis обнаружили криптомайнер Norman. Они получили с нескольких машин уведомления, указывавшие на подозрительную сетевую и файловую активность. При анализе криптомайнера специалисты использовали Wireshark для проверки подозрительных машин, и программа показала, что криптомайнер, названный Норманом, активно взаимодействовал с командно-контрольными серверами (С&C) через DuckDNS. С помощью Wireshark команда Varonis увидела все адреса C&C-серверов, используемых злоумышленниками, поэтому они смогли отрезать связь с ними и остановить атаку.