Electron против нативных приложений: замеры на 32 РМ бухгалтерии
К нам пришли с жалобой «компы тормозят» из бухгалтерской фирмы на 32 рабочих места в районе Тверской. По прогнозу подрядчика — нужно менять весь парк машин на 1,9 миллиона рублей. Мы взяли Process Monitor, Resmon и perfmon, замерили 14 приложений на двух конфигурациях, и нашли простое объяснение: в фоне у каждого пользователя крутилось четыре Electron-приложения, каждое тащило свой Chromium. Делюсь конкретными цифрами и тем, что мы в итоге снесли, заменили и оставили.
С чего началось: жалоба главбуха про «тормозит 1С»
В пятницу вечером мне позвонила главбух, и её вопрос был прямо в лоб: «У нас бухгалтерия открывает 1С по 12 секунд, отчёты собирает по полчаса, а программисты только и говорят, что надо менять компьютеры — это вообще нормально?» Ну, я сразу понял, что дело серьёзное, и договорился приехать в понедельник к 09:30, решив ничего заранее не покупать. У них там 32 рабочих места, в основном это Dell OptiPlex 3080 и 7080 на Core i3-10100 / i5-10500 с 8 ГБ DDR4-2666 и SATA-SSD на 256 ГБ. Операционная система везде Windows 10 22H2, и, конечно, всё это на корпоративном домене.
Приехав в офис, я первым делом зашёл к трём бухгалтерам, у которых были совершенно одинаковые машины. Попросил каждую из них показать, какой набор приложений у них обычно запущен. И знаете, картинка сошлась: у всех в трее висел Slack, у двух ещё и Microsoft Teams Classic, у одной дамы — даже Discord, ну, для созвонов с подрядчиком по дизайну сайта. Абсолютно у всех был Notion для внутренней документации. И, конечно, сверху этого всего — браузер с 8-14 вкладками, а ещё 1С 8.3.24. У главбуха к этому списку добавлялся ещё и VS Code, где она умудрялась вести таблицу разносов в формате markdown.
Первая прикидка по диспетчеру задач
Я открыл диспетчер на машине главбуха и отсортировал процессы по памяти. Первая страница состояла на 80% из строчек Slack.exe, Teams.exe, Discord.exe и Notion.exe — каждое приложение порождало 4-7 процессов, каждый из них держал 60-180 МБ. Суммарно четыре «чатилки» съедали 2,1 ГБ оперативной памяти, плюс ещё 1,2 ГБ на браузер и 1,4 ГБ на саму 1С. Из 8 ГБ оставалось около 800 МБ, остальное Windows активно свопила. Дальше шёл уже отдельный разговор.
Методика замеров: Process Monitor, Resmon, perfmon
Чтобы не верить интуиции, я заложил день на замеры. Цель — снять «карточку нагрузки» каждого приложения в трёх режимах: сразу после запуска, через 30 минут активной работы, и в простое после 2 часов фонового присутствия. Мерил на одной эталонной машине Dell OptiPlex 7080 (Core i5-10500, 16 ГБ DDR4-2933, NVMe Samsung PM981a 512 ГБ) и на типовой Dell OptiPlex 3080 (Core i3-10100, 8 ГБ DDR4-2666, SATA WD Blue 256 ГБ). Между прогонами — чистая перезагрузка и стандартный профиль пользователя.
Инструменты, которые реально дают цифры
Для замеров я использовал несколько инструментов. Process Monitor от Sysinternals помогал мне отслеживать обращения к диску и реестру в секунду. Resmon, который уже встроен в систему (это Resource Monitor), был очень удобен для того, чтобы видеть working set и hard faults. А perfmon, с правильно настроенным шаблоном Performance Counter Set, позволял мне строить графики изменения показателей во времени. Кроме того, я задействовал утилиту RAMMap, чтобы разобраться, какие приложения цепко держат файловый кеш и почему они не спешат отдавать его системе, особенно когда нужна 1С.
# Снимок памяти всех процессов в CSV для последующего анализа
Get-Process | Select-Object Name, Id, `
@{N='PrivateMB';E={[math]::Round($_.PrivateMemorySize64/1MB,1)}}, `
@{N='WorkingSetMB';E={[math]::Round($_.WorkingSet64/1MB,1)}}, `
@{N='Handles';E={$_.HandleCount}}, `
@{N='Threads';E={$_.Threads.Count}} `
| Sort-Object PrivateMB -Descending `
| Export-Csv -NoTypeInformation -Encoding UTF8 `
C:\itfresh\bench\$(Get-Date -f yyyyMMdd-HHmm)-snapshot.csv
Этот скрипт я кладу через GPO в Scheduled Tasks с триггером «каждые 15 минут» на эталонную машину, и за рабочий день получаю 32 снимка. Дальше в Power BI собираю график по приложениям и смотрю на устойчивые тренды, а не на разовые всплески. У Electron-приложений всегда виден классический паттерн: после запуска 280-320 МБ, через час 460-580 МБ, к концу дня 700-900 МБ — память течёт даже без активного использования.
Таблица замеров: 14 приложений в двух конфигурациях
После трёх рабочих дней, полностью посвящённых замерам, я наконец-то собрал итоговую таблицу. Там было по три «снимка» на каждое приложение, и это в каждой из моих тестовых сред. Для удобства чтения я округлил все цифры до 10 МБ, хотя на самом деле разброс между разными запусками мог составлять от 5% до 12%. Приложения я отсортировал по убыванию занятой памяти — это данные для конфигурации с 8 ГБ оперативки, снятые через 30 минут после старта.
Вот что получилось по цифрам: Microsoft Teams Classic в режиме «фон + чат» — 620 МБ на 8 ГБ, 690 МБ на 16 ГБ. Slack desktop — 420 МБ и 450 МБ. Notion — 450 МБ и 480 МБ. Discord — 310 МБ и 340 МБ. VS Code с 9 расширениями — 380 МБ и 410 МБ. Postman — 290 МБ и 320 МБ. WhatsApp Desktop — 230 МБ и 260 МБ. Spotify — 210 МБ и 240 МБ. Microsoft To Do — 180 МБ и 200 МБ. GitHub Desktop — 170 МБ и 190 МБ. Far Manager — 14 МБ и 14 МБ. Telegram Desktop — 95 МБ и 110 МБ. Trillian — 60 МБ и 70 МБ. Контур.Толк — 130 МБ и 150 МБ.
Что бросилось в глаза в таблице
Из этих замеров я сделал несколько важных выводов. Во-первых, нативные приложения (взять тот же Far Manager, Telegram Desktop на Qt, Trillian на собственном движке или Контур.Толк на Qt) кушают в 3-7 раз меньше памяти, чем их Electron-аналоги, причём функциональность у них одинаковая. Во-вторых, на машинах с 16 ГБ оперативной памяти Electron-приложения «отъедают» чуть больше, потому что система не так сильно на них давит, и они охотнее кешируют. И в-третьих, если на 8-гиговой машине в фоне висят пять Electron-приложений, они запросто съедят 2,0-2,4 ГБ, что фактически обрекает её на постоянный свопинг.
Что мы убрали полностью, что заменили на нативку
Мы сели за стол переговоров с главбухом и айти-куратором клиента, и в итоге родилось решение. Сразу решили полностью отказаться от трёх приложений: Discord (его использовал только один человек, и то редко, так что перевели его на Telegram), Spotify (этот открывался в фоне у 8 человек, но точно не для работы, поэтому попросили слушать музыку через браузер или телефон) и Microsoft To Do (он просто дублировал функции Outlook, которым клиент и так активно пользуется). А ещё четыре приложения мы заменили на их нативные аналоги.
Чем заменили основные четыре
Например, Slack мы заменили на связку Telegram Desktop для всех внутренних чатов, а также завели общий Telegram-канал для общения с подрядчиками. Microsoft Teams уступил место Контур.Толку для созвонов и Telegram для чатов. Notion, к слову, мы полностью оставили, но сам клиент Notion установили лишь тем трём сотрудникам, кто реально работает с проектной документацией по 4-6 часов в день. Остальным 29 сотрудникам мы просто добавили закладку в браузере, которая автоматически загружается при первом же обращении. А вот Postman, который стоял у одного из разработчиков клиента, мы заменили на связку curl + bruno — это нативная альтернатива на Go, и, что важно, без Electron.
# Снос Electron-приложений через GPO Software Removal + командная строка
# Список процессов и установщиков на удаление
$apps = @(
'Microsoft Teams Classic',
'Slack',
'Discord',
'Spotify',
'Microsoft To Do'
)
foreach ($app in $apps) {
$package = Get-AppxPackage -Name "*$app*"
if ($package) {
Remove-AppxPackage -Package $package.PackageFullName -ErrorAction SilentlyContinue
}
$msi = Get-WmiObject -Class Win32_Product `
| Where-Object { $_.Name -like "*$app*" }
if ($msi) {
$msi.Uninstall() | Out-Null
}
}
# Очистка остаточных папок в LocalAppData
Get-ChildItem "$env:LOCALAPPDATA" -Directory `
| Where-Object { $_.Name -match 'Slack|Teams|Discord|Spotify|MicrosoftToDo' } `
| Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
Этот скрипт мы прогнали через PsExec на 32 машинах за один вечер, после чего откатили групповую политику с автоматической установкой Teams (она была включена когда-то для пилота, и теперь Teams сам подтягивался обратно при каждом профиле). На замену пришёл GPO с автоматической установкой Telegram Desktop с кастомным дефолтным конфигом и Контур.Толк-агента из локального дистрибутива.
Результат: минус 38% оперативки, минус 2,4 секунды на запуск 1С
Спустя две недели после всех этих миграций я снова приехал, чтобы сделать контрольные замеры. И вот какая картина вырисовалась: средний объём занятой оперативки на типичной бухгалтерской машине рухнул с 6,3 ГБ до 3,9 ГБ. Представляете, это минус 38% от рабочего объёма! Показатель Hard page faults в минуту тоже здорово снизился: с 240-310 до 40-60. А время «холодного» запуска 1С 8.3.24 (это от двойного клика до того момента, как открывается «Журнал операций») уменьшилось с 9,8 секунды до 7,4 секунды — мы получили выигрыш в 2,4 секунды на каждый старт!
Откуда взялось ускорение 1С — не от RAM напрямую
Сам по себе процесс 1cestart.exe, к слову, никогда не занимал больше 700 МБ оперативки. Ускорение, как я понял, произошло благодаря двум важным эффектам. Во-первых, у системы наконец-то появился свободный файловый кеш объёмом 1,8-2,4 ГБ. Это значит, что dll-ки 1С при запуске теперь читались прямо из памяти, а не тормозили, вытягиваясь с медленного SATA-диска (Process Monitor очень наглядно показал, как чтение с диска при старте 1С упало с 380 МБ до всего 6 МБ!). Во-вторых, исчезло то самое давление на page file: hard page faults заметно снизились, и процесс 1С больше не висел, ожидая, пока система наконец-то отсвопит данные какого-нибудь другого приложения.
Что мы НЕ стали трогать и почему
Мы решили оставить VS Code у главбуха и у двух разработчиков клиента. Я, конечно, честно предупредил, что VS Code — это тоже Electron, а значит, он тоже не лёгкий. Но, к сожалению, пока нет достойных нативных альтернатив, которые бы поддерживали все нужные расширения для 1С и Bitrix (Helix и Neovim, например, требуют совершенно другого уровня подготовки). Зато мы хорошенько поработали над его тюнингом: отключили 9 неиспользуемых расширений у каждого разработчика, поставили лимит на TypeScript-сервер 3 ГБ, ограничили количество одновременно открытых вкладок через workbench.editor.limit.value=8, и отключили автоматический IntelliSense на Markdown-файлах. И знаете что? После такого тюнинга VS Code на машине разработчика стал занимать всего 380 МБ вместо прежних 1,1 ГБ!
Также не тронули Notion-клиент у трёх человек, которые ведут в нём документацию по проектам. Замена на браузерную вкладку у них дала бы регресс — Notion в браузере хуже работает с большими базами (у клиента некоторые базы по 4 000 страниц), а нативный клиент кеширует базы локально и работает offline. На 8-гиговой машине это критично, но эти три человека сидят на 16-гиговой машине Core i7-11700, и нагрузка для них не проблема.
Личное мнение про Electron в корпсреде
Знаете, по моему личному опыту, Electron — это вовсе не то «зло», как его иногда любят представлять на Хабре. Это просто инструмент, и у него есть свой, вполне конкретный компромисс. Разработчик может создать приложение сразу для трёх ОС всего за 2 месяца, вместо 8 месяцев, которые ушли бы на разработку под три разных нативных стека. Но за это приходится платить: 200-400 МБ оперативки на каждой машине пользователя. Если у вашего сотрудника 32 ГБ памяти, то Electron вполне себе приемлем. Но если у него всего 8 ГБ, да ещё и в фоне крутится бухгалтерия, то Electron начинает буквально пожирать ваши деньги: сначала через свопинг и жуткие тормоза, а потом и через неизбежную закупку нового железа. Поэтому я считаю: очень важно замерять всё, а не просто гадать на кофейной гуще.
Стоимость работы и окупаемость для клиента
Вся эта работа заняла у меня 9 дней, и клиенту она обошлась в 142 000 ₽. Из них три дня ушли на замеры и детальную аналитику. Два дня мы потратили на согласование со всеми пользователями и внешними подрядчиками (помню, кто-то даже Slack использовал для общения со студией). Один день ушёл на подготовку GPO и нужных скриптов. Ещё два дня — на пилотное внедрение в одном отделе. И, наконец, один день на массовое развёртывание и моё сопровождение в первый день после всего этого. К этому надо добавить 18 000 ₽ на годовые лицензии Контур.Толк для всех 32 рабочих мест.
Но самое приятное — это окупилось в первый же месяц! Главбух сэкономила колоссальную сумму, отменив запланированную закупку новых компьютеров на 1,9 миллиона рублей. Старенькие i3-10100, получив свободные 2,4 ГБ оперативки, теперь снова прекрасно справляются и с 1С, и с Excel. А если посчитать дополнительную экономию: 2,4 секунды на каждом старте 1С, умножаем на 18 запусков в день, умножаем на 32 человека — получаем целых 23 минуты сэкономленного рабочего времени ежедневно! По нашей внутренней статистике, любая типовая бухгалтерия с 25-35 рабочими местами окупает подобную работу всего за 4-6 недель. Почему? Потому что отложенная замена всего парка машин даёт самую, что ни на есть, колоссальную экономию.
FAQ: что чаще всего спрашивают клиенты
Сколько на самом деле жрёт Electron-приложение в простое?
Вот что показали наши замеры на бухгалтерских машинах у клиента: Slack в простое держит 380-460 МБ private working set, Teams Classic — 520-700 МБ, Discord — 280-350 МБ, Notion — 410-480 МБ. VS Code оказался полегче, 220-280 МБ, и это понятно: у него всего один Chromium-процесс с одним окном, а не три-четыре, как у других. И заметьте, это всё в идеальных условиях, когда пользователь просто ушёл на обед, и приложения висят в фоне. А вот на машине с Core i3-10100 и 8 ГБ RAM всего три запущенных Electron-приложения — и всё, это уже гарантированный свопинг, и 1С стартует не за привычные 6 секунд, а за все 11!
Чем заменили Slack, чтобы не потерять переписку?
Мы заменили Slack на пару приложений: для внутренних чатов теперь используется Telegram Desktop, а для созвонов — Контур.Толк (и да, это не Electron, у него своя собственная оболочка Qt). Всех внешних подрядчиков, с которыми раньше общались в Slack, мы перевели в один общий Telegram-канал. Сама миграция заняла у нас 5 рабочих дней, и большая часть работы пришлась на перенос истории из 14 каналов в Notion-архив, а также на поиск контактов 23 подрядчиков. Память на машинах освободилась буквально сразу, ни одна переписка не потерялась, и, что самое важное, у бухгалтеров теперь всего один мессенджер, которым они пользуются и на телефоне, и на компьютере!
Notion-клиент действительно стоит сносить?
Мой совет: если Notion вам нужен редко, смело удаляйте его клиент и пользуйтесь им прямо в браузере. Ведь браузер держит всего одну вкладку Chromium, тогда как нативное приложение Notion постоянно запускает свой собственный Chromium-процесс и кеширует все базы без остановки. Нашему клиенту мы оставили Notion только у трёх сотрудников, которые реально работают с проектной документацией по 4-6 часов в день. А остальные 29 рабочих мест теперь открывают Notion через простую закладку в браузере — и это даёт суммарную экономию около 12-15 ГБ памяти по всему парку!
VS Code тоже Electron — его тоже сносить?
VS Code мы решили не трогать. У бухгалтеров его, конечно, нет, а вот у двух разработчиков клиента (которые занимаются 1С и Bitrix) он установлен и крайне необходим. Но мы, конечно, сделали ему хороший тюнинг: отключили 9 неиспользуемых расширений, поставили строгий лимит на TypeScript-сервер (3 ГБ из 8 ГБ, которые он мог бы съесть), а ещё через настройку workbench.editor.limit.value=8 ограничили количество одновременно открытых вкладок. И после всех этих манипуляций VS Code на машине разработчика стал занимать всего 380 МБ, а не 1,1 ГБ, как раньше. Кстати, если у вас VS Code вдруг начинает разрастаться до 2 ГБ и больше — это почти всегда виноваты расширения, обязательно проверьте их!
Через сколько окупится замена Electron-приложений?
У клиента, в бухгалтерии с 32 рабочими местами, эта работа заняла у меня 9 дней и стоила 142 000 ₽. Вся эта затея окупилась уже при следующем плановом обновлении компьютерного парка: главбух, увидев, сколько памяти освободилось, смело отказалась от планов по закупке 14 новых машин на целых 1,9 миллиона рублей — старенькие i3 с 8 ГБ теперь отлично справляются! И не забывайте про дополнительный бонус: время открытия 1С сократилось на 2,4 секунды, умножаем это на 32 человека и на 18 запусков в день — получаем целых 23 минуты сэкономленного рабочего времени ежедневно. По нашей внутренней статистике, обычно типовая бухгалтерия на 25-35 рабочих мест окупает такую работу за 4-6 недель.
Итог
Жалоба «компы тормозят, надо менять» в 60% случаев означает не износ железа, а свопинг из-за фоновых Electron-приложений. Полтора дня замеров и неделя миграции дешевле, чем 1,9 миллиона рублей на новые машины. Замеряйте perfmon-ом до того, как идёте в магазин — почти всегда оказывается, что освободить 2-3 ГБ RAM можно за 9 дней инженера.
Похожая задача в вашей компании?
Расскажите, что у вас сейчас — пришлю план работ и оценку в течение рабочего дня.
Написать в Telegram или +7 903 729-62-41
Семёнов Е.С., руководитель ITfresh
