Q: FreeBSD и CPU C-states

Вот мучаюсь в непонятках, есть две FreeBSD-коробки с одинаковым ядром и одинаковыми же настройками (потому что сделаны клонированием), разница в железе (и процессор и сетевые карты и материнки - проще сказать что одинаковое.... ничего там нет одинакового).  И у одной процессор жрет ~1ватт (если на коробке ничего не происходит), а на другой - целых два (по powermon)

Видимая разница в C-states.

Коробка №1 (i3-6300T), которая 0.95-1вт

# sysctl dev.cpu.0
dev.cpu.0.cx_method: C1/mwait/hwc C2/mwait/hwc C3/mwait/hwc
dev.cpu.0.cx_usage_counters: 1902729 301031 6950232
dev.cpu.0.cx_usage: 20.78% 3.28% 75.92% last 5104us
dev.cpu.0.cx_lowest: C8
dev.cpu.0.freq_levels: 3201/35000 3200/33218 3100/31812 2800/27748 2700/26449 2600/25170 2400/22685 2200/20302 2000/18010 1900/16900 1700/14749 1500/12692 1300/10722 1200/9770 1000/7934 800/6182
dev.cpu.0.freq: 800

Коробка №2 (i3-7100U), которая ~2-2.2 ватта в простое

# sysctl dev.cpu.0
dev.cpu.0.cx_method: C1/mwait/hwc C2/mwait/hwc C3/mwait/hwc
dev.cpu.0.cx_usage_counters: 1097457 6112991 77
dev.cpu.0.cx_usage: 15.22% 84.77% 0.00% last 725us
dev.cpu.0.cx_lowest: C3
dev.cpu.0.freq_levels: 2401/15000 2400/15000 2300/14088 2100/12607 2000/11888 1800/10495 1700/9680 1500/8372 1400/7738 1300/7119 1100/5789 1000/5209 800/4090 700/3550 500/2386 400/1885
dev.cpu.0.freq: 400

Не то, чтобы я сильно озабочен был одним ваттом (это рубля три в месяц разницы), но неаккуратненько. Несмотря на то, что 7200U снижает частоту аж до 400 мегагерц (против 800 у 6300Т), жрет - вдвое.

Смущает cx_lowest ну и вообще полное отсутствие использования C3. Не надо ли в BIOS что-то про C-states поковырять, например?

 

Comments

powerd-то запущен? С одинаковыми профилям?

Я ещё бы попробовал в качестве эксперимента отключить турбо в BIOS (Вижу, что тон у тебя включён).

А то мне тут попалась коробка (скорее – матплата, но там всё-в-одном, типа NUC'а) у которой включение Turbo приводило к совершенно хаотичному и странному поведению (я не поленился проверить — и под Linux тоже, так что особо FreeBSD не пообвиняешь).

У i3 нету турбы, но поищу :)

powerd запущен и все вообще одинаково, кроме собственно железки.

ACPI считает, что есть: dev.cpu.0.freq_levels: 2401/15000
Вот эта частота 2401 (max + 1) – это состояние турбы. Которое P-States, и рулится в обработчике SMM, в BIOS.

Ну это место у двух ящиков выглядит одинаково.

А, матери и BIOS одинаковые? Тогда да, врядли в этом дело.

матери и BIOS разные

А. Ну тогда я вообще ничему не удивлюсь. Энергопотребление и особенно во сне очень сильно зависит от матери и BIOS'а.

А ещё есть пор sysutils/turbostat (портированный с линуха) который показывает текущие честные частоты. Включая турбу.

Только надо хорошо понимать, что turbostat показывает, вот тут описание https://www.mankier.com/8/turbostat мне пришлось раз 5 прочесть.

Ну уж CPU%c3 я пойму - и там нули

Правда не нули в CPU%c7, что отдельно интересно.

Может и правда в BIOS где-то ещё lowest state в C2 стоит? Я видел на некоторых матерях настройку типа «Какие C states разрешать».

Может быть, конечно.

Но это уже боевой роутер, полезу туда с утра, когда семейство еще спать будет и интернету не просить.

Вообще, я не настоящий сварщик, просто буквально неделю назад возился с железкой, которая мсебя вела странно в этом месте, но там всё, что помогло, — отключить Turbo в BIOS.

Ну я лазил в BIOS и бежал в ужасе - ничего трогать не стал :)

https://ark.intel.com/search?q=i3-7200U не знает о таком процессоре.

Покажите вывод ports sysutils/x86info 'x86info -r'.

7100U конечно. x86info с утра уже

x86info v1.31pre
Found 4 identical CPUs
Extended Family: 0 Extended Model: 8 Family: 6 Model: 142 Stepping: 9
Type: 0 (Original OEM)
CPU Model (x86info's best guess): [Kabylake mobile]
Processor name string (BIOS programmed): Intel(R) Core(TM) i3-7100U CPU @ 2.40GHz

eax in: 0x00000000, eax = 00000016 ebx = 756e6547 ecx = 6c65746e edx = 49656e69
eax in: 0x00000001, eax = 000806e9 ebx = 00100800 ecx = 7ffafbbf edx = bfebfbff
eax in: 0x00000002, eax = 76036301 ebx = 00f0b5ff ecx = 00000000 edx = 00c30000
eax in: 0x00000003, eax = 00000000 ebx = 00000000 ecx = 00000000 edx = 00000000
eax in: 0x00000004, eax = 1c004121 ebx = 01c0003f ecx = 0000003f edx = 00000000
eax in: 0x00000005, eax = 00000040 ebx = 00000040 ecx = 00000003 edx = 11142120
eax in: 0x00000006, eax = 000027f5 ebx = 00000002 ecx = 00000009 edx = 00000000
eax in: 0x00000007, eax = 00000000 ebx = 029c67af ecx = 00000000 edx = 0c000000
eax in: 0x00000008, eax = 00000000 ebx = 00000000 ecx = 00000000 edx = 00000000
eax in: 0x00000009, eax = 00000000 ebx = 00000000 ecx = 00000000 edx = 00000000
eax in: 0x0000000a, eax = 07300404 ebx = 00000000 ecx = 00000000 edx = 00000603
eax in: 0x0000000b, eax = 00000001 ebx = 00000002 ecx = 00000100 edx = 00000000
eax in: 0x0000000c, eax = 00000000 ebx = 00000000 ecx = 00000000 edx = 00000000
eax in: 0x0000000d, eax = 0000001f ebx = 00000440 ecx = 00000440 edx = 00000000
eax in: 0x0000000e, eax = 00000000 ebx = 00000000 ecx = 00000000 edx = 00000000
eax in: 0x0000000f, eax = 00000000 ebx = 00000000 ecx = 00000000 edx = 00000000
eax in: 0x00000010, eax = 00000000 ebx = 00000000 ecx = 00000000 edx = 00000000
eax in: 0x00000011, eax = 00000000 ebx = 00000000 ecx = 00000000 edx = 00000000
eax in: 0x00000012, eax = 00000000 ebx = 00000000 ecx = 00000000 edx = 00000000
eax in: 0x00000013, eax = 00000000 ebx = 00000000 ecx = 00000000 edx = 00000000
eax in: 0x00000014, eax = 00000001 ebx = 0000000f ecx = 00000007 edx = 00000000
eax in: 0x00000015, eax = 00000002 ebx = 000000c8 ecx = 00000000 edx = 00000000
eax in: 0x00000016, eax = 00000960 ebx = 00000960 ecx = 00000064 edx = 00000000

eax in: 0x80000000, eax = 80000008 ebx = 00000000 ecx = 00000000 edx = 00000000
eax in: 0x80000001, eax = 00000000 ebx = 00000000 ecx = 00000121 edx = 2c100800
eax in: 0x80000002, eax = 65746e49 ebx = 2952286c ecx = 726f4320 edx = 4d542865
eax in: 0x80000003, eax = 33692029 ebx = 3031372d ecx = 43205530 edx = 40205550
eax in: 0x80000004, eax = 342e3220 ebx = 7a484730 ecx = 00000000 edx = 00000000
eax in: 0x80000005, eax = 00000000 ebx = 00000000 ecx = 00000000 edx = 00000000
eax in: 0x80000006, eax = 00000000 ebx = 00000000 ecx = 01006040 edx = 00000000
eax in: 0x80000007, eax = 00000000 ebx = 00000000 ecx = 00000000 edx = 00000100
eax in: 0x80000008, eax = 00003027 ebx = 00000000 ecx = 00000000 edx = 00000000

Total processor threads: 4
This system has 1 dual-core processor with hyper-threading (2 threads per core) running at an estimated 2.40GHz

 

Ok, CPUID[6].eax[2] == 1, так что C3 запрещено или из-за того, что есть постоянная активность устройств, или из-за бага в BIOSе.

Сделайте вот что:
# kgdb /boot/kernel/kernel /dev/mem
(kgdb) p/x cpu_quirks
и покажите результат.

Кроме того, попробуйте отключить USB или в BIOSе, или не загружать xhci.ko/ehci.ko/uhci.ko или не добавлять устройства в конфиг ядра.

(kgdb) p/x cpu_quirks
$1 = 0x0

Отключить USB так просто не могу, это надо искать куда консоль воткнуть (IPMI на этой мамке нету)

BIOS на предмет C-states изучу, да.

Раз quirks == 0, это точно из-за того, что какое-то устройство все время пишет/читает память. USB хост обычно первый кандидат.
Если в BIOSе есть опция C1E, то с ней C1 может стать более экономным, чем C2/C3.

Выключить USB я скорее не могу чем могу.
Ну то есть выключив - не смогу его включить :)

Выключить энергопотребление USB можно средствами операционки, а не в BIOS: первым делом переместить все драйвера USB из конфига ядра в /boot/loader.conf

Вторым делом почитать # sysctl -d hw.pci.do_power_nodriver
hw.pci.do_power_nodriver: Place a function into D3 state when no driver attaches to it. 0 means disable. 1 means conservatively place devices into D3 state. 2 means aggressively place devices into D3 state. 3 means put absolutely everything in D3 state.

Третьим делом в /boot/loader.conf закомментировать загрузку драйверов USB-устройств и включить hw.pci.do_power_nodriver=1

Я правильно понимаю, что если я уберу загрузку USB-драйверов, то USB-клавиатура тоже не будет работать?

Подожду тогда шнурка RS232->USB, а то включить загрузку USB будет нечем (если где-то, к примеру, ошибусь)

Но раз уж тут:

Кого убирать из ядра, все вот эти:
device uhci # UHCI PCI->USB interface
device ohci # OHCI PCI->USB interface
device ehci # EHCI PCI->USB interface (USB 2.0)
device xhci # XHCI PCI->USB interface (USB 3.0)
device usb # USB Bus (required)
device ukbd # Keyboard
device umass # Disks/Mass storage - Requires scbus an

?
Или только *hci ?

Если не отключать USB в BIOS, то в loader prompt клавиатура работать будет, так как loader использует сервисы BIOS для доступа к оборудованию.

В loader.conf переносить из ядра вообще всё USB-шное. Если после этого закомментировать загрузку USB-стека со всеми драйверами, то клавиатура после загрузки ядра работать не будет, но всегда можно будет ребутнуться в loader prompt и сказать там load /boot/kernel/uhci.ko и usb.ko и ukbd.ko и kernel и потом boot.

USB нету, использование C3 не появилось :(

Я писал не про использование C3, а про снятие питания с USB-устройств.

Ну я к тому, что тут выше поставили диагноз по переписке "дело может быть в USB"

Ну вот пока рецепт "убрать его на" - не спас. Буду пробовать в BIOS отключить. Недельки через три, как кабель придет.

А есть ли на этих ящиках zfs?

Там где меньшее потребление в простое - есть. Где больше - нет.

Тогда мимо. Подумалось на l2arc, который с заданным интервалом непрерывно сканирует arc.

Не могу ничего сказать про FreeBSD, но могу сказать за интеловские C-states, энергопотребление и линукс. Эти самые C-states нынче есть не только у CPU, но еще и у GPU и у всего package целиком. В свежих версиях turbostat это обозначается как CPU%c*, GFX%rc6 и Pkg%pc* соответственно. В простое у меня по данным того же turbostat больше всего кушает именно package (т.е. всяческий uncore), и это хорошо коррелирует с тем, что говорит о потреблении батарея.

На глубину package C-state (PC) и время нахождения в нем влияют состояния не только CPU и GPU, но и различных контроллеров, про которые Интел говорит «у нас теперь в процессоре есть специальная поддержка %interfacename во имя скорости/безопасности». У себя я больше всего воевал с отключением Thunderbolt, но кроме того это может быть IOMMU aka VT-d (в линуксе контролируется опциями ядра), SATA, возможно USB (начиная где-то со Skylake?), далее везде.

Для укрощения встроенного GPU в линуксе можно покрутить ручки RC6, FBC (особенно актуально для hidpi мониторов), PSR (возможно, все еще с осторожностью) и какие-нибудь еще, в i915 их много.

Да, и про С-states CPU в BIOS: возможно, имеет смысл прицельно поискать Intel® Speed Shift Technology
https://ark.intel.com/compare/95442,90728

Кстати, если проц совместимый, то нынче завезли забавную штуку sysutils/powermon чтоб посмотреть сколько жрётся

Да, ее в соседнем треде где-то посоветовали, пользую вовсю.

Но turbostat еще прикольнее.

Ну... если уж упарываться по полной https://github.com/opcm/pcm в порты не знаю затащил ли кто, но билдилась и вроде работало
У меня к сожалению только на лаптопе проц по полной поддерживает, а в десктопный как то плохо эту фичу завезли :(

Оно есть и собирается, но счастья не приносит: Unsupported processor model (158).