Бессонница Windows 11 и как с ней справиться

Логотип компании
Бессонница Windows 11 и как с ней справиться
Купили ноутбук на базе новейшей Windows 11 и не можете понять, почему аккумуляторная батарея устройства постоянно разряжена, несмотря на то что вы ее перманентно заряжаете?
Бегаете по сервисным центрам в надежде заменить брак, оставляете негативные отзывы на маркетплейсах, шлете безответные письма в службу поддержки производителя или в Microsoft? Растерянный продавец убеждает, что ноутбук совсем новый, а брак исключен, производитель осторожно отмалчивается, сервисный центр просит таймаут, а проблема остается нерешенной? Судя по всему, вы столкнулись с крупнейшей на сегодняшний день проблемой современных ноутбуков, работающих под управлением Windows 11. Причем создается ощущение, что в нормализации ситуации не заинтересованы ни производители ноутбуков, ни разработчик операционной системы. Попробуем разобраться, так ли это и что можно сделать.

Причины

Суть проблемы на поверхности: ноутбук произвольно выходит из режима сна без каких-либо действий со стороны пользователя. В полном соответствии с законом Мерфи происходит это в самый неподходящий момент. Типичный сценарий: вы  немного поработали, захлопнули крышку ноутбука, положили его в рюкзак и едете на деловую встречу на другой конец города, а, приехав на место, обнаруживаете, что ноутбук, который перед выходом показывал 90-100% заряда, разряжен почти в ноль, а то и вовсе не включается. Хорошо, если с собой есть адаптер, а если нет? В любом случае нужно искать причины и проблему как-то решать. Тут сразу стоит отметить, что в современных версиях ОС семейства Windows грань между выключенным и спящим устройством довольно тонкая. Кроме того, существуют разные уровни чуткости сна устройства, на котором активирован спящий режим.

Эта история началась еще во времена Windows 8, когда инженеры и маркетологи Microsoft пришли к выводу, что портативные компьютерные устройства под управлением Windows должны быть максимально похожими на смартфоны, то есть как можно дольше быть в Сети и по мере возможности продолжать выполнять некие системные процессы. Зачем – отдельный, философский вопрос, но в результате этих экспериментов в ОС Windows 8.1 появилась первая версия соответствующей модели поведения компьютера –  ‘Connected Standby’.

 С тех пор велась долгая и, вероятно, кропотливая работа по доведению до совершенства функций, решающих задачу мимикрии ноутбука под смартфон, итогом которой стал новый режим электропитания под названием ‘Modern Standby’, или, по-другому, ‘S0 state/S0 power model’. Если он активирован, можно считать, что система никогда не отключается полноценно, на 100%, а питание, пусть и в ограниченном режиме, постоянно подается не только на оперативную память (как, например, в старом добром ‘S3 state’), но и на другие элементы ноутбука (Wi-Fi-модуль, процессор и т. д.). По утверждениям разработчиков Microsoft, такой подход позволяет компьютеру всегда оставаться подключенным к сети (как локальной, так и Интернет), управлять фоновыми активностями, быстро включаться и реагировать на голосовые команды, в частности на приветствие голосового помощника Cortana.

Тем не менее базовая реализация оказалась не совсем удачной, поэтому на деле некоторые ноутбуки живут своей жизнью, не согласовывая хаотичные включения или фоновые задачи с владельцем устройства. Если ноутбук просыпается, будучи отключенным от электросети, то при выполнении энергозатратных активностей (например, попытке обновить саму ОС и прикладное ПО) может достаточно быстро израсходовать остаток заряда. Кроме того, если использование ‘Connected Standby’ в Windows 8 не было принудительным, а режим легко включался/отключался, то с ‘Modern Standby’ всё сложнее. В большинстве современных ноутбуков это единственный по умолчанию предлагаемый режим сна на системах Windows даже в случае, если сами устройства поддерживают и другие варианты работы (например, S3). Но проблема была бы неполной без того, что производителям техники не хочется заниматься одновременной поддержкой нескольких режимов сна на одном устройстве, поэтому множество новеньких ноутбуков технически поддерживают только новый режим – S0.

С проблемой можно столкнуться на самых разных ноутбуках и версиях Windows 10/11. Результат плюс-минус одинаковый: при закрытии крышки ноутбука невозможно достоверно понять, ушла система в спящий режим или выключилась, а также не включится ли она самостоятельно через некоторое время. Кроме того, на непосредственный результат могут влиять и другие факторы или их комбинации. Например, точно имеет значение, подключен ли кабель питания ноутбука к электросети, а также как именно пользователь завершил работу устройства – перешел в режим сна через меню «Пуск» или просто закрыл крышку. Акцент здесь на слове «может», так как помимо перечисленных пунктов существует ряд других тонких настроек энергосбережения, которые влияют на поведение гаджета.

На канале Linus Tech Tips в YouTube есть хороший видеоролик на английском языке, в котором канадский техноблогер Линус Себастьян (Linus Gabriel Sebastian) рассказывает о проблеме и способах ее решения. Видео выложено 3 декабря 2022 года, и вспомнили мы про него потому, что информация, представленная в нем, до сих пор актуальна. Еще интереснее некоторые комментарии, оставленные под этим видео. В частности, пользователь с ником @andre_ss6, представившийся инженером-программистом Microsoft, утверждает, что ему удалось воспроизвести проблему на тестовой системе, и он передаст результаты своих тестов в отдел разработки OC Windows.

Вот вкратце суть этого эксперимента. На главном тестовом ноутбуке был настроен Windows PowerShell, прослушивающий определенный сетевой порт все время, в течение которого устройство подключено к электросети. При каждом подключении клиента к этому порту скрипт автоматически печатает в консоли время, когда было установлено соединение. С другого устройства автор эксперимента отправлял тестовый пакет данных на ноутбук-приемник, на экране которого отображалось время получения пакета. После этого принимающий ноутбук усыплялся, а с другого компьютера отправлялся еще один пакет данных на уже спящее устройство. Через минуту после последнего действия ноутбук-приемник выводился из спящего режима. В зависимости от того, был ли ноутбук подключен к электросети в момент перехода в спящий режим, результаты разнятся. Так, если ноутбук был подключен к розетке в момент нажатия кнопки «Сон», то после выхода из режима сна было видно окно Powershell с распечатанными сообщениями и указанием времени, в которое ноутбук спал. С учетом того, что этот скрипт работает только в режиме реального времени, то есть не настроен на доставку сообщений в офлайн, это означает, что ноутбук продолжал жить активной сетевой жизнью во время сна. Но при постоянном подключении к электричеству это не проблема ни для пользователя, ни для ноутбука (может быть, кроме шума охлаждающих вентиляторов, который возможен, если ноутбук начнет решать трудоемкие задачи). Если же ноутбук был отключен от электросети (то есть полагался только на аккумуляторную батарею) в момент перехода в сон, то после выхода из режима сна в Powershell не было сообщений, отправленных на это устройство во время его сна. То есть сетевые функции ноутбука в это время не работали.

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

Объясняется происходящее просто. Если при работе от батареи проверить доступные ноутбуку состояния сна с помощью команды ‘powercfg /a’ в командной строке Windows, то в верхней части списка мы получим ответ: “Standby (S0 Low Power Idle) Network Disconnected”, что означает отсутствие сетевой активности во сне со стороны ноутбука. И если мы отправим ноутбук в сон в таком режиме, он заснет, как полагается, и не будет проявлять чрезмерную фоновую активность. Если же подключить к работающему (не спящему) устройству кабель питания, состояние изменится на ‘Standby (S0 Low Power Idle) Network Connected’: то есть с этого момента ноутбук полагает, что в режиме сна также можно выполнять полезную сетевую работу (действительно, ведь он подключен к розетке – бояться нечего, можно даже скачать и установить пару гигабайтных обновлений). Однако если отправить ноутбук в сон при подключенном кабеле питания, режим работы устройства останется ‘Connected’ (не изменится на ‘Disconnected’). Будучи во сне, устройство теряет способность к обнаружению подключения/отключения питания, поэтому, если ноутбук ушел в сон в состоянии ‘Connected’, то в нем и останется даже после отключения кабеля во время сна.

Кстати, если кто-то желает повторить этот эксперимент, выкладываем скрипты для Powershell как есть – пробуйте! 

Скрипт для сервера (ноутбук-приемник, который тестируем):

***

> $Listener = [System.Net.Sockets.TcpListener]52134;

> $Listener.Start();

> while($true)

> {

>    $client = $Listener.AcceptTcpClient();

>    Write-Host("Connected at " + $(Get-Date));

>    $client.Close();

> }

***

Скрипт для клиента (любой другой ПК в той же локальной сети): 

***

> $hostIp = ""

> $port="52134"

> (new-object Net.Sockets.TcpClient).Connect($hostIp, $port)

***

Способы решения

Первое, что приходит на ум, – отключать кабель питания от ноутбука и только после этого отправлять его в режим сна. Это действительно самый быстрый и логичный способ, который  подойдет всем, кто не желает погружаться в тонкости глубинных настроек энергосбережения. Единственный недостаток (кроме редкого случая, когда способ в принципе не сработает) в том, что порядок действий должен быть отработан до автоматизма. Ведь если вы забудете, что кабель нужно отключать именно до ухода ноутбука в сон, а не после, то с высокой долей вероятности снова столкнетесь с разряженной в ноль батареей.

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

Почетное третье место – поиск любых устройств и процессов, которые могут выводить Windows из сна, и изменение способов их взаимодействия с компьютером. В рамках этого подхода мы не пытаемся отключить или обмануть режим ‘Modern Standby (S0)’, но минимизируем число триггеров, способных влиять на разряд батареи при работе ноутбука в режиме ‘Standby (S0 Low Power Idle) Network Connected’. Для этого нужно вручную отключить возможность вывода ноутбука из сна в связи с активностью периферийных устройств – мышки, клавиатуры, сетевой карты и т. п. То есть в консоли вводим команду ‘powercfg -devicequery wake_armed’ и получаем нужный список, после чего вручную через «Диспетчер устройств» отзываем разрешение на вывод из ждущего режима, данное каждому из устройств. Кроме того, имеет смысл проверить и отключить таймеры пробуждения, настроенные в планировщике заданий: для этого пользуемся командой ‘powercfg –waketimers’. Далее стоит отключить возможность самостоятельного выхода из сна Windows для ежедневного автоматического обслуживания: достаточно снять галочку напротив пункта «Разрешать задаче обслуживания пробуждать мой компьютер в запланированное время» в разделе  «Центр безопасности и обслуживания» («Изменить параметры обслуживания»). Либо просто изменить время этой процедуры на более подходящее.

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

На четвертом месте расположились способы, работоспособность которых может существенно варьироваться от системы к системе. Хотя, согласно официальной позиции Microsoft, эти методы вовсе не должны работать – ведь компания официально ведет борьбу с применением подобных обходных путей на практике. И вендора можно понять, так как из-за нерасторопности производителей системных плат и процессоров, которые не спешат дорабатывать прошивки своих чипов, при внесении неофициальных изменений в профили работы электропитанием существует риск серьезных сбоев в управлении электропитанием ноутбука, вплоть до механических повреждений ПК. Поэтому все действия, затрагивающие системный реестр Windows и ключевые настройки BIOS материнской платы, производятся пользователем на свой страх и риск, то есть под полную личную ответственность.

Итак, с помощью упомянутой выше команды ‘powercfg /a’ читаем, какие режимы электропитания поддерживаются устройством. На данном этапе нас интересует поддержка режима Standby S3, который может служить оптимальной и привычной альтернативой S0. Если в ответ на команду вы получаете сообщение о том, что данный режим не поддерживается прошивкой (“The system firmware does not support this standby state”), то, скорее всего, про смену режима Standby с S0 на S3 придется забыть. Хотя для верности можете поискать возможность активации S3 в настройках BIOS материнской платы. Если же S3 поддерживается, но выключен в связи с тем, что в данный момент активирован S0 (“Standby S3. This standby state is disabled when S0 low power idle is supported”), то в реестр Windows по пути [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power] необходимо добавить параметр «"PlatformAoAcOverride"=dword:00000000». Также можно попробовать отключить режим ‘Connected’ в случае если активен профиль S0, а изменить его на S3 не представляется возможным из-за отсутствия поддержки последнего на уровне оборудования. Для этого нужно в реестре Windows по пути [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power] добавить параметр «"CsEnabled"=dword:00000000».

Повторюсь, Microsoft утверждает, что смена режимов электропитания с помощью реестра Windows или BIOS матплаты невозможна без полной переустановки ОС. Одним словом, сработает какой-то из этих способов или нет, – дело случая.

Выводы

Проблема не была бы проблемой, если бы вендор подошел к ее решению более адекватно. Раньше в настройках электропитания Windows была простейшая опция, позволявшая в пару кликов изменить возможность вывода ноутбука из сна сетевыми событиями: «всегда», «только при подключении к электросети», «никогда». Но в Microsoft сначала решили спрятать эту возможность, а потом и вовсе заблокировали. Какой в этом смысл, остается только гадать.

Хочется верить, что однажды производители начнут более чутко прислушиваться к отзывам своих пользователей. Описанная нами проблема затронула действительно очень многих, и, казалось бы, компания, зарабатывающая миллиарды, давно могла ее решить. Но нет, Microsoft выбирает борьбу с любыми, пусть даже неуклюжими попытками решить ее самостоятельно. Тем временем в справках и мануалах продолжают красоваться лозунги, что именно об этом (режиме ‘Modern Standby’) мечтали пользователи...

Опубликовано 18.08.2023

Похожие статьи