Windows Performance Station або як я вчив комп працювати ефективно

image

Здрастуйте, шановні читачі! Ось я і дістався до Хабра і хочу повідати історію свого проекту. Багато аспектів власного досвіду і роботи доводиться описувати досить загальними термінами, щоб не зачепити комерційну таємницю тих організацій, про яких йде мова.

Суть цієї розповіді в тому, щоб поділитися знайденим методом вирішення проблеми продуктивності комп'ютерів на Windows і розповісти про підхід, який дозволив зробити дане рішення повністю універсальним і індивідуальним для кожного користувача. На написання коду та підбір найбільш ефективних механізмів знадобилося близько 2х років щоденної роботи, а також консультації і допомогу від великої кількості моїх товаришів з різних IT областей, за що їм величезне спасибі.

Отже, ця історія почалася в 2013ом році, в той час я працював в одній великій міжнародній організації виробляє порошки, шампуні. Посада у мене була сисадминская, але, як це часто буває, по суті я був «тыжпрограммистом». Суть роботи зводилася до підтримки деяких систем СЕД, написання різних макросів на VBA, утіліток для автоматизації або інтеграцій різних простеньких систем і т. п.

І як раз в той же час я вирішував одну з наболілих проблем організації, а саме, незадовільну роботу різного ПЗ на нових ноутбуках багатьох співробітників. По суті, мені довелося зіткнутися з проблемою, яка виникає у багатьох сисадмінів великих компаній — на комп'ютерах персоналу, крім улюблених ними MS Office, SAP, 1С і т. п., був присутній не менш улюблений усіма фахівцями IT «mcafee», «punto switcher», «mail супутник» і що тільки не. Тут варто уточнити, що дана компанія тоді просувала ліберальне ставлення до комп'ютерів співробітників, і, по суті, зарождала у себе BYOD.

Так як скарги на продуктивність надходили в т. ч. і мені, я став шукати програми для налаштування продуктивності на подобі Process Lasso. Мій вибір тоді ліг на «Bill2's Process Manager». На той момент я знайшов багато альтернатив, але всі вони мали моторошно перевантажений інтерфейс і на власну роботу отъедали більше ресурсів, ніж можна було вивільнити оптимізацією.

image
Знайдений на той момент «Bill2's Process Manager» мав масу переваг перед системними засобами, т. к. був досить простим в управлінні і настройці. По суті, він дозволяв робити те ж саме, що вміє диспетчер задач, а саме, задавати базовий пріоритет і маску ядер для додатків, але, на відміну від диспетчера, давав можливість зберегти ці параметри після перезавантаження і розрізняв додатки які відображаються у вікнах на робочому столі або працюють у тлі.

Завдяки цьому додатком мені вдалося вирішити одну з найбільш нагальних проблем, пояснити комп'ютера з якими додатками я працюю зараз, і що для мене важливіше — EXCEL або фонова установка оновлень.

Але, незважаючи на те, що для мене це додаток вирішило основну проблему, воно мало масу недоліків:

  1. Відсутність наступності конфига, не можна було просто скопіювати додаток з одного компа на інший з аналогічною конфігурацією, потрібно було налаштовувати заново. Частково ця проблема вирішувалася запаковкой налаштованого програми в Portable экзешник. (Може якось можна було витягнути параметри з реєстру, але на той момент я не розібрався).

  2. Відсутність управління RAM, а саме стисненням оперативної пам'яті. У багатьох твикеров є так звана «дефрагментація пам'яті», що по суті є нісенітницею, т. к. дефрагментувати оперативку абсолютно безглуздо з точки зору продуктивності. Мені потрібно було чистити дані, які висять в оперативці і не падають в SWAP, щоб при різкій навантаженні на RAM вона вже була вільна і ОС не намагалася вгадати, що тобі зараз в RAM потрібно, а що ні. До речі, через рік ця фішка штатно з'явилася в Windows 10, але там це архівування усередині оперативної пам'яті, що теж по суті не зовсім вирішує проблему.

  3. Відсутність управління пріоритетами вводу-виводу на жорсткий диск (або SSD). Штатно Windows має цю функцію ще з вісти, але активно використовуватися вона почала тільки в Win10.

  4. Відсутність визначення фокусної» програми, т. к. оконность це ще не все, якщо я працюю з десятком додатків, в одному з яких щось компілюється, а в іншому я дивлюся YouTube, то мені зовсім не хочеться, щоб YouTube лагал якщо фокус вікна на ньому, а не на інших вікнах.

  5. Неможливість вказати папку з додатками, щоб разом застосувати правило до нових встановлюються програмами.
По суті, вивчаючи архітектуру Windows я постійно знаходив безліч відмінних механізмів, які дозволяють вибудувати продуктивність в системі ідеально за умови одного «АЛЕ». АЛЕ, якщо програмісти, які пишуть своє ЗА повідомлятимуть операційній системі, що їх робить, для чого воно призначене (ігри, фільми тощо) і з яким пріоритетом воно повинно звертатися до ЦП/RAM/HDD.

image

У житті ж, виходить, що тільки мала частина пишеться з урахуванням програмної архітектури Windows, більшість виробників, в т. ч. дуже серйозних і великих, пишуть без вказівки цих параметрів і ОС використовує всі за замовчуванням.

І це не кажучи про служби, які абсолютно безпардонно від'їдає будь-які доступні ресурси як тільки надходить евент до дії (типу завантаження та встановлення оновлень). Бажаючі перевірити ситуацію на своєму ПК можуть відкрити диспетчер завдань і відобразити стовпець «базовий пріоритет» у вкладці з процесами.

Трохи дану ситуацію виправляє MMCSS, але він дуже м'яко впливає на процеси, майже не зачіпаючи їх фактичну продуктивність.

image
Сама неприємна річ багатозадачності в Windows, яка мене постійно переслідувала, було прослуховування музики під час ресурсномістких операцій. Т. к. я під час роботи слухав музику через Хром і запускав розрахунки великих таблиць в Excel, звук мав особливість подвиснуть саме на момент повного завантаження ЦП або постійно похрипывать при кожному стрибку цієї навантаження. Дана ситуація майже повністю зважилася використанням «Bill2's Process Manager», але його потрібно було вручну налаштувати на Хром, щоб той не кректав і виходило, що хром весь час у підвищеному пріоритеті, навіть коли музика не потрібна, що вже було не гуд.

Тут варто уточнити, що комп'ютери і тоді використовувалися досить потужні за мірками ноутбуків. На той момент це був Core i5 2430m / 8GB Ram / 256GB SSD.

При цьому, зароджувався тоді в компанії BYOD припускав, що співробітники зі своїми робочими ноутбуками можуть працювати всюди, в т. ч. з дому і, при цьому, використовувати робочий ПК як домашній для перегляду фільмів, ігор і т. п.

image
Всі ці фактори в результаті наштовхнули мене на думку про написання власного додатка, який буде вбирати в себе все найкраще від наявних альтернатив і усуне їх недоліки, при цьому буде не просто інтерфейсом для налаштування як диспетчер завдань, а повністю автоматичною системою для адаптації продуктивності під виконану задачу. По суті, я збирався створити ідеальну структуру для BYOD на своєму ПК, в якій я міг би попрацювати без зниження продуктивності процесами Steam, iTunes або т. п. і погратися, подивитися фільми без впливу корпоративного софта, антивірусів і т. п.

Для вирішення даної задачі мені знадобилося залучити кількох своїх друзів, які так само працювали в IT. Початкова думка була в тому, щоб зробити додаток для нашого власного зручності та розширити власні знання по роботі ОС і різних додатків.

image
Справа була за малим, спочатку ми написали простеньку альтернативу «Bill2's Process Manager», але без інтерфейсів налаштування, щоб додаток працювало з преднастроенным конфіг. Основною фішкою було визначення того, які розгорнуті вікна, які процеси працюють у фоні і який додаток у фокусі. Так само відразу додали опцію призначення пріоритету не тільки процесу, але і всім процесам з певної папки. Написати цей додаток було досить просто і завдяки наявному досвіду відразу ж вийшло допустити витоків пам'яті, витоку хендлерів, вильотів та інших багів т. к. додаток повинно було працювати в фоні тривалий час без перезавантажень. Щоб додаток був легким і працювало ефективно, ми використовували тільки стандартні функції ОС і WinAPI. На самому початку ми обходилися навіть без інтерфейсу.

image
Наступним етапом було написати локальний алгоритм навчання, який за вхідними параметрами визначав би призначення програми. За основу була взята математична модель нейромережі з нейронами на основі порогової передатної функції, але на той момент не враховувалися вагові коефіцієнти, які ми додали пізніше. Ця нейромережа спочатку вчилася тільки на базових параметрах часу роботи з додатком, його імені, правилом конфігурації і розташування на жорсткому диску (наприклад, якщо багато додатків постійно використовуються і не працюють у тлі, розташовані в одній кореневої папки типу «C:/Games/», то швидше за все всі наступні додатки, які запускаються з цієї папки будуть активно використовуватися і знижувати їх пріоритет у тлі не потрібно).

Для доведення цього алгоритму до досконалості знадобилося майже пів року. Надалі кількість вхідних параметрів для аналізу збільшувалася і підбиралися оптимальні правила, що застосовуються до сторонніх додатків.

Тут варто уточнити, що на відміну від класичних диспетчерів завдань, ми вирішили не керувати пріоритетами, ядрами, оперативкою і введенням-виведенням окремо, а об'єднали ці параметри в правила, які комбінували в різній пропорції. Наприклад, для заголовного додатки правило = FOREGROUND (доступні всі ядра, пріоритет вище середнього, пріоритет введення-виведення високий, оперативку в SWAP не скидаємо).

image
Надалі до алгоритму навчання були додані параметри положення вікна (є екранне вікно програми, згорнуто воно або розгорнуто. Якщо розгорнуто на весь екран і в фокусі, то потрібно приділити цьому процесу більше уваги, ніж фоновим тощо).

Було додано визначення служб, оскільки однаково називаються процеси служб svchost.exe виконують зовсім різні завдання.

Найскладнішим, мабуть, було навчити додаток розрізняти однакові процеси по різному призначенням. Наприклад, багато браузери запускають для кожної окремої вкладки окремий процес (Chrome, Firefox, Yandex, Opera тощо), а звук і відео відтворюють хост процеси, отже з 20ти процесів хрому, коли він не в фокусі, потрібно підвищити ті процеси, які відтворюють звук. Це ж стосується і будь-яких інших процесів, які можуть працювати в фоні.

image

Щоб не прописувати в конфіги всі відомі світові процеси, в кінцевому рахунку додаток навчилося визначати не тільки те, як часто користувач працює з процесом, але й фактичне призначення процесу та його важливість для роботи.

Таким чином додаток навчилося розподіляти навантаження по ключових вузлів комп'ютера в залежності від того, з чим в даний момент працює користувач. Більш того, навантаження розподіляється індивідуально для кожного ПК в залежності від сценарію використання будь-якої програми, тобто використовується воно в вікні, відтворює воно відео/звук/3d, як багато користувач звертається до даного додатка і в якій папці дане додаток розташоване.

Додаток вийшло простим і універсальним, установка відбувається в пару кліків і для роботи не потрібно ніяких налаштувань, всі адаптується автоматично.

image

Вся ця логіка не могла б існувати без тісної інтеграції з системою, тому для реалізації всіх механізмів довелося задіяти по максимуму функції Windows API. Це дозволило при мінімальних витратах розрахункових потужностей достукатися до глибоких функцій ядра і зберегти максимальну сумісність з будь-яким ПК на x86-64 процесорі.

Так само, важливо було враховувати тип комп'ютера з яким працює користувач. Наприклад, при роботі від акумулятора використовуються дещо інші алгоритми роботи з ядрами ЦП, щоб зменшити навантаження і заощадити заряд. Були додані опції керування живленням, щоб можна було не вимикати ноутбук або планшет, а, погасивши екран, продовжувати слухати музику або виконувати завантаження/копіювання/архівування файлів з енергоспоживанням близько сплячого режиму.

Так само важливо було навчитися визначати як процесор працює з багатопоточністю і як розподіляє навантаження на ядра.

Всі дані алгоритми в сукупності допомогли створити дійсно універсальне рішення, яке не є твикером або розгоном і не обмежує функціональності ОС і іншого ПО. По суті, програма вчить комп'ютер розуміти запити користувача і управляти навантаженням на ключові вузли так, як це робив би досвідчений адмін для кожної конкретної задачі.

image
З часом до роботи над даним проектом приєдналися інші мої товариші, які допомагали займатися дизайном, сайтом, групою ВК і т. п. питаннями.

Передчуваючи різні поради від гуру, хочу відразу згадати, що мій сумарний досвід роботи в IT на даний момент становить 8 років. За час роботи над даним додатком я зустрічав багато суперечливої інформації на тему особливостей роботи ОС і деяких компонентів ПК, тому не здивуюся, що хтось може бути не згоден з деякими описаними підходами, але кінцеве тестування показало ефективність даних рішень.

Навіть в професійній сфері моїх колег, багато хто до кінця не розуміють тонкощі роботи ЦП, багатопоточності, багатозадачності і багатоядерності. Інформацію про деяких системних функцій Windows доводилося знаходити в найвіддаленіших частинах інтернету. Найскладнішим, мабуть, було знайти працюючий(!) спосіб установки високого пріоритету вводу-виводу стороннім додаткам.

Описаний механізм не є сферичним алгоритмом у вакуумі і успішно працює на реальних машинах. У випадках де реально використовується багатозадачність — збільшення продуктивності може становити до 50%.

image
Фінальним штрихом для роботи над додатком стало підписання сертифікатом «code signing» для ОС Windows.

Велике спасибі всім, хто осилив цей текст до кінця.

p.s. Прошу вибачення за деяку сумбурність, намагався укласти тільки саму головну інфу, щоб не сильно розростався текст.

Ми поширюємо додаток за схемою Freemium, щоб будь-який користувач міг скористатися самими основними функціями, але нам буде дуже приємно, якщо спільнота Хабра нас підтримає, щоб наш проект зміг розвиватися далі.

У нас є ще безліч ідей щодо збільшення функціональності і продуктивності нашого додатка, щоб зробити його ще краще і ефективніше.

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

Я буду радий розповісти більш докладно про різні аспекти роботи програми окремо, якщо ця стаття викличе інтерес.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.