Для лиги лени: русификация Windows Server – зло и порождение союза Сатаны и Саддама Хусейна.
Часть 1, или откуда все началось
Это история из следующей статьи, но и тут пригодится.
Когда-то, давным-давно, умер у меня в дисковом массиве диск. Поскольку дело было давно, году может в 2005, а может в 2010, а может и не у меня, то детали я уже и не вспомню. Умер он странно. Вроде умер, а вроде и нет. По SMART все отлично, но. То задержки в записи по полсекунды, то ошибка записи, то еще чего-то. По каким причинам массив этот диск не выкинул, уже и не узнать, и не вспомнить.
Третьего дня (еще в феврале) у меня такая же история и НЕХ приключилась с Micron SSD (7500 PRO U.3: 3840GB). Жил себе диск жил, и вдруг полезли вверх дисковые задержки. Самое неприятное, в том, что если у классических RAID контроллеров, и классических SAS дисков, все эти SMART метрики, и не только, читаются, и даже отдаются в систему, то у Micron SSD все 2.5 утилиты, что linux-nvme - nvme-cli, что Linux \ Windows Storage Executive Software, что msecli – никаких метрик не показывают. Как и ОС показывает примерно ничего. Просто внезапно полезли задержки, и все. Как эмулировать ситуацию, в какие события смотреть – в моменте было не понятно.
По мониторингу диск или здоров, или не здоров, или мертв. Учитывая, что это NVME, то его диагностика под нагрузкой то еще развлечение. Как и диагностика, что еще пошло не так из списка: сам диск, NVME backplane, PCIe линия от процессора до диска, или же в процессоре что-то умерло - Integrated Input/Output controller (IIO), и чего в этом менять. Все вместе было не очень понятно в первые пару часов.
Конечно, после эвакуации данных, и вдумчивой сборки-разборки дисковой группы, стало чуть понятнее, но с мониторингом, и прочими observability, надо было, и будет, что-то решать.
Возможно (но это не точно) повторяется, в том или ином виде, история с
IBM HDD DTLA Click of Death, Fujitsu (припой 2000-2002), Cisco 2014 (возможно, что и Juniper) и памятью (Memory Component Issue), генераторами в 2017 (Clock Signal Component Issue).
В 2018 году мне пришлось прошивать несколько дисков, из-за слишком зеленой прошивки.
В 2019 году были большие проблемы с HPE SSD после 32.768 часов работы.
В 2020 году были проблемы у всех - Dell, HP, Cisco SSD умирали через 40.000 часов.
Или, может, просто у меня диск умер, статистики пока нет.
Как говорил один иностранный консультант, Data center SSD смертен, но это было бы ещё полбеды. Плохо то, что он иногда внезапно смертен, вот в чем фокус!
Часть 2, или про русификацию Windows Server
Прибежали в избу дети, Второпях зовут отца:
Тятя, тятя, нету сети! И не загружаецца!
Недавно попросили посмотреть, что там у людей с системой. Посмотрел.
Я уже давно, очень давно, не видел русского Windows Server, а тут вот и он.
В чем отличие русифицированного Windows server? В том, что он русифицирован, но не просто криво, а и кусками, и криво. Меню перевели. И счетчики.
Сообщения Microsoft Defender SmartScreen перевели как «Бег» и «Отмена». Сообщения в журнале событий и без перевода порой отличаются глубиной анализа уровня «что-то пошло не так», но в русском переводе совершенно утрачивают смысл.
Скрипты выгрузки чего-то из журналов тоже приходится подгонять под «русификацию».
В глубинах настроек Active Directory, сразу за первым меню в mmc, половина названий переведена, половина не переведена. Мастер делегирования перевели так, что у меня чуть глаза не вытекли.
И, разумеется, у людей, которые ставят русский Windows Server, все остальное сделано точно так же, то есть через жопу. Русские названия Organizational Unit (OU). Русские названия групп. Русские названия сетевых папок, серверов, всего.
Да, это работает. Пока у вас один сервер. Любая автоматизация натыкается на то, что русские буквы могут быть в виде UTF 7, 8, Win1251 и еще несколько вариантов на тему. Особым успехом пользуется одновременное использование русской с и английской c. Хорошо себя показали обе o.
Разумеется, 99% разработчиков никогда не слышали про локальные языки, поэтому часть программ требует наличия учетной записи Administrator. И не работает от учетной записи Администратор.
Да, существуют SID (Security identifiers) и существуют Well-known SIDs, такие как S-1-5-21-500, сами посмотрите -
Get-LocalUser | ? {$_.SID -like "*-500"} ,
но кто ж их использует?
Можно умело воткнуться в русификацию групповых политик, и, особенно, в Administrative Template files (ADMX/ADML). Которые могут быть с русификацией. Но могут и не быть.
Разумеется, у людей, ставящих русский Windows, теоретическая часть тоже хромает. Репликацию AD писали люди, видевшие некоторые вещи, поэтому ее сломать так сразу нельзя. Но, кривые руки сетевиков, и информационной безопасности, плюс антивирус на контроллерах домена, плюс кое-какие настройки, дают на выходе членский билет даже не в Blue Oyster bar, а сразу в Arse Tickler's Faggot Fan Club.
Разумеется, вместо repadmin /showrepl начинаются рассказы «да винда говно», «мы ничего не нажимали», и прочие истории «оно же пингуется, значит работает». Хотя надо было брать в руки хотя бы Test-NetConnection, и идти по списку портов с двух сторон. Потом брать палку.
У сетевиков особым успехом пользуются разные firewall с двух сторон подсетей, использование и не использование двойного NAT, и прочие прекрасные истории с асимметричной настройкой.
А за скрюченной рекой
В скрюченном домишке
От информационной безопасности имеется скрюченный из коробки антивирус, с такими же скрюченными настройками.
Со стороны «типа админов» мало кто осиливает прочитать How to configure a firewall for Active Directory domains and trusts , и уж тем более не осиливает прочитать Guidance for configuring IPv6 in Windows for advanced users, поэтому они просто отключают фаерволл, и снимают чекбокс с IpV6. Потому что ну не понятно же, как так??
This registry value doesn't affect the state of the following check box. Even if the registry key is set to disable IPv6, the check box in the Networking tab for each interface can be selected. This is an expected behavior.
Хотя написано же, и в рамочку обведено в статье Guidance for configuring IPv6 in Windows for advanced users:
We don't recommend that you disable IPv6 or IPv6 components or unbind IPv6 from interfaces. If you do, some Windows components might not function.
Два раза написано, для совсем непонятливых:
We don't recommend unbinding IPv6 from an Ethernet or WiFi network adapter without a justifiable need. Windows is tested with, and some products and features expect, IPv6 to be bound and functional.
Unbinding IPv6 from a network adapter can result in an unsupported Windows configuration.
Часть 3, наконец, про счетчики Windows
Добрался я тогда и до них.
Общеизвестно, что счетчики и описания можно дергать более чем несколькими способами.
Все равно это живет на дне океана в Windows Management Instrumentation (WMI):
Можно вытащить все сразу: Get-CimClass -Namespace root/CIMV2
Можно по частям: Get-CimInstance Win32_PhysicalMemory или (Get-CimInstance win32_processor).loadpercentage
Можно забирать объекты: Get-WmiObject Win32_Processor
Можно забирать счетчики: Get-Counter -ListSet *
В последнем способе и порылись русификаторы, о чем тоже написано:
Performance counter names are localized. The examples shown here use the English names of the performance objects, counters, and instances. The names will be different on a system that uses another language. Use the Get-Counter -ListSet command to see the localized names.
В ключе реестра:
Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009
Лежит 1000000000 значений, и в powershell они выгружаются как TypeName: System.String.
Выглядит это как-то так:
Что абсолютно не читаемо для неподготовленного человека. Возьмем код отсюда, немного допишем в читаемый вид, new-object, ну вы серьезно чтоли. Только классы, только xml, только хардкод.
Примечание. Отсюда - Querying performance counters from PowerShell – тоже можно код взять.
Примечание. Количество счетчиков зависит от ОС.
Для MS Windows server 2025 у меня вышло 4744 значения (до какого-то там патча, давно не включал эту виртуальную машину), последние ID -
7248 Responses: Successful Polling Responses/sec
7250 Responses: Failure Polling Responses/sec
Для Windows 11 – 5494 значения,
8352 Responses: Successful Polling Responses/sec
8354 Responses: Failure Polling Responses/sec
Часть 4, или минуточка горения
В документации к Zabbix указано, что у счетчиков, кроме имен, существуют еще и ID. И можно по ним и ходить, смотри главу 6 Windows performance counters.
Но посмотрим, что там пишут.
"\Memory\Page Reads/sec"
Попробуем:
Get-Counter "\Memory\Page Reads/sec" – так работает
Get-Counter "\4\24" – так не работает. Потому что, во первых, в документации ошибка, счетчик id не 24, а 42, Get-Counter "\4\42", но и Get-Counter "\4\42" тоже не работает.
О чем и жалуются в обсуждении Using Performance Monitor counter IDs instead of the counter names – 2, что Get-Counter -Counter "\2\10" работает, "\4\28" работает, а так нет, не работает.
И не только там, много где жалуются, например:
The following parameters can be configured for this plug-in. For object ID and counter ID parameters, it has been observed that numeric ID values for these parameter may not always be resolved by the native Windows Performance Data Helper APIs used by the PERFMON Plug-in. In such cases, it is advisable to use the corresponding text strings for the object and counter IDs over the numeric ID values. Windows Perfmon
Пойдем перебором, что остается то. Жалкие 5000 переменных, хороший повод разделить задачу на блоки по 500, и переписать как Job, но мне лень (В итоге переписал, конечно). Все равно в пределах первых 500 параметров есть только \2\10, \4\28, \52\54, \86\88, \262\388, \330\388, \582\584, \638\640, \1150\1152.
Это похоже на паттерн, немного перепишем код и вуаля:
Windows 11 – 47 "таких" счетчиков
Windows server 2025 – 53 "таких" счетчика.
Часть 5, рекомендованная литература
Часть 6, и про однополые браки.
Вот это - Using the ArgumentList parameter, точно писали в семье из двух мужиков.
Насчет такой русификации у меня такие же подозрения.
Я хотел было сюда написать немного кода, но было бы чего писать.
$RKeyEng = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009'
$RKeyLocal = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\CurrentLanguage'
$CountersEng = (Get-ItemProperty -Path $RKeyEng -Name Counter).Counter
$CountersLocal = (Get-ItemProperty -Path $RKeyLocal -Name Counter).Counter
$CountersEng.count #комментарии избыточны
$CountersEng[0..5]
$CountersEng[-5..-1]
class DasKlass {
[string]$ID_Eng
[string]$ID_Local
[string]$Name_Eng
[string]$Name_Local
[string]$Digital_Bypass}
$Out1 = @()
$countersEnglishCount = $CountersEng.count / 2
for($num = 0; $num -lt $countersEnglishCount; $num++) {
$SingleCount = [DasKlass]::new()
$indexId = ($num * 2)
$SingleCount.ID_Eng = $CountersEng[$indexId]
$indexName = $indexId+1
$SingleCount.Name_Eng = $CountersEng[$indexName]
$Out1 += $SingleCount # я знаю, что на leetcode, codility и algomap.io, так делать нельзя
Remove-Variable SingleCount }
$Out1.Count
$Out1[0..3] | ft
$Out1[-3..-1] | ft
Как была примета "русская винда в продуктиве - к проблемам", так и осталась. Ничего нового.