[Из песочницы] Майнер на сайте — зло (но может стать и добром)
Часто на Хабре можно встретить комменты в духе «Майнер — хороша замена/дополнение к рекламе на сайте» или «Я лучше отдам 10–40% CPU». Данная статья приведёт аргументы, почему такие утверждения в корне неверны. Также статья выдвинет предположение, как можно решить приведённые проблемы, позволив майнерам стать дополнительным источником монетизации, что может положительно сказаться на вебе.
Справка: майнер — это программа для майнинга криптовалюты. Может встраиваться в сайты, принося автору сайта прибыль. Майнинг может использовать как мощности процессора, так и видеокарты (javascript может запускать шейдеры с помощью WebGL).
Почему майнер — зло
Данные причины могут быть очевидны многим, но выступающие за майнинг их не учитывают.
- Пользователь купил дорогую процессор/видеокарту чаще всего не для того чтобы половину ядер отъели майнеры. Допустим, я потратил на процессор 20к. Если у меня отожрут половину его ядер, получается, 10к потрачено впустую. А если я купил дешёвый процессор/видеокарту, то этот пункт ещё критичнее, ведь тогда ресурсы мне ещё важнее.
- Из-за недобросовестных майнеров лагает не только открытый сайт, но и другие сайты и даже вся система. Но если вы — добросовестный майнер, отжирать только часть ресурсов — не решение, т. к:
- Это всё-равно не гарантирует отсутствия лагов.
- Если пользователь открыл несколько вкладок, и майнят сразу несколько сайтов, то мы всё-равно получим превышение, после которого начнутся лаги. В условиях, когда могут быть открыты сотни вкладок, такой сценарий очень вероятен.
- Аналогично мы получим превышение, если пользователь сам запустил какие-то программы.
Лаги из-за майнинга сложно контролировать. Как пользователю, мне лучше вообще было не открывать тот сайт, чем получить лаги. Только не всегда я знаю о майнере. - Если сайт не уведомил меня о майнинге, он просто может мешать моей работе. Например, если я купил 8 ядер, то будут времена, когда они будут простаивать, но будут также и времена, когда они нужны все. Один из самых простых примеров — я решил посмотреть фильм, но не смог сделать это из-за майнера. Причём насколько бы мощный комп Вы не купили, его ресурсы будут отжираться майнером.
- Майнинг — это перевод электричества в деньги, поэтому майнер, который не уведомляет меня о своей работе, по факту крадёт мои деньги, т. к. оплачивать затраченную электроэнергию приходится мне.
- Майнер приводит к разряду батареи.
- Майнеры не могут проверить, запущены ли майнеры на других открытых сайтах. Уже открыв несколько вкладок можно полностью перегрузить систему.
- Обычно для нормальной работы всегда должно быть свободно какое-то количество ресурсов. Майнер не может узнать, сколько ресурсов свободно в данный момент.
- Майнеры вызывают шум вентилятора.
- Если бы все сайты начали устанавливать майнеры, прибыль, которую они могут получить, тоже бы падала, т. к. ресурсы пользователя ограничены. Даже сейчас прибыль очень мала, а что, если она упадёт ещё в 10 раз? При этом неудобства пользователю мы причиняем огромные.
- Майнер обычно действует скрытно. Например, увидя сайт с рекламой, я могу отдать предпочтение другому сайту, т. е. у меня есть выбор. А вот с майнером выбора у меня нет.
- Неопытные пользователи могут не понимать, почему лагает система.
- Когда Вы поняли, что Вам мешает майнер, поиск вкладки с майнером очень раздражает. А ещё хуже, когда Вы не поняли, что Вам мешает майнер.
- Добросовестность майнера трудно контролировать. При этом добросовестные майнеры — редкость.
Если кратко, то майнеры вызывают лаги, мешают работе, крадут деньги (с помощью электроэнергии), разряжают аккумулятор, вызывают шум вентилятора и полностью перегружают систему при открытии нескольких вкладок. При этом майнер, в отличие от рекламы, действует скрытно, отбирая у пользователя выбор.
Если Вы откроете 10 вкладок, то при повсеместном майнинге прибыль сайтов уменьшится в 10 раз по сравнению с текущей ситуацией. Получается, майнинг приносит маленький доход, но большие неудобства пользователям.
Решения проблем
п. 2 (лаги), п. 3 (мешает работе), п. 6 (несколько вкладок) и п. 7 (оставление свободных ресурсов) можно попытаться решить программно, например, делая раз в секунду на долю секунды тестовую загрузку на 100%, и проверяя, сколько вычислений удалось провести. Из минусов:
- Мы не можем узнать, насколько сильно мы при этом ущемили другие процессы, поэтому определить таким способом свободные ресурсы можно было бы только в случае, если бы мы запускались с самым низким приоритетом, но такой возможности нет.
- Определение будет с задержкой.
- Невысокая точность.
- Не учитывается наличие скачкообразных нагрузок.
- Нельзя учесть использование shared-ресурсов. Например, даже если майнер будет работать в половину мощности, это не значит, что он не может забить кэш L3, который может кому-то понадобиться. Кроме того, забитие кэша понизит производительность однопоточных приложений.
п. 5 (разряд батареи) — можно решить, если браузер будет уведомлять, подключено ли устройство от сети.
п. 8 (шум вентилятора) — можно решить, если установить в браузере настройку, какой процент ресурсов может быть суммарно задействован в системе. Данная настройка должна учитываться сайтами. Из минусов — она может использоваться для отслеживания.
Решение сразу всех пунктов (кроме девятого)
Решить сразу все пункты можно, если браузеры будут заносить в чёрный список сайты с майнерами, не соблюдающими следующие правила:
- Майнер должен оставлять как минимум 50% свободных ресурсов вне зависимости от нагрузки системы. Если система уже загружена на 50%, майнер не должен работать.
- Майнер должен посылать браузеру специальное уведомление о майнинге. Данное уведомление браузер отобразит значком в адресной строке, а также на самой вкладке, как это уже делается с проигрыванием аудио.
- Майнер не должен работать, если пользователь запретил майнинг на всех сайтах или на текущем сайте.
- Майнер не должен работать при работе от батареи.
Конечно же, даже если сайт находится в чёрном списке, пользователь всё-равно должен иметь возможность зайти на сайт после соответствующего предупреждения. Аналогичным образом могут поступать и поисковые системы, понижая недобросовестные сайты в результатах выдачи.
Недостаток в том, что проверять сайты очень трудоёмко, а также майнер может показываться не всем посетителям. Другой недостаток — не решён восьмой пункт (шум вентилятора).
Более продвинутое решение
Более продвинутое решение — встроить майнинг прямо в браузер, тогда сам браузер автоматически проконтролирует выполнение всех пунктов, а пользователю не будет доставлено никаких неудобств (обратите внимание на четыре правила, которые я привёл выше). Автору сайта остаётся лишь выбрать, какую валюту майнить.
Преимущества
- Теперь все встроенные майнеры будут считаться недобросовестными, т. е. выявление майнеров не станет сложнее, чем сейчас. В предыдущем же способе это было усложнено.
- Мы можем обеспечить лучшую производительность (равно как и худшую, т. к. нет конкуренции между программами-майнерами).
- Решёна проблема с шумом вентиляторов, ведь теперь настройка мощности хранится в самом браузере и не передаётся сайтам, а значит и не может использоваться для отслеживания.
- Простота настройки для автора сайта.
При этом по факту браузерам необязательно блокировать недобросовестные сайты самостоятельно, а можно оставить это сторонним продуктам, например, антивирусным программам или дополнениям.
Недостатки
Решение обладает рядом существенных недостатков:
- Поддерживать это всё со стороны браузеров трудоёмко. Особенно трудоёмка поддержка разных программ-майнеров от разных валют. С другой стороны, браузеры могут получить дополнительную монетизацию за счёт продвижения определённых валют.
- Девятый пункт (отсутсвие выгоды, когда все начнут майнить) мы побороть никак не можем. Это значит, что разработчики браузеров должны проделать огромную работу, которая может не принести никакой пользы вебу.
- При определении свободных ресурсов осталось много нюансов. Мне, как пользователю, выгоднее отключить майнинг. Впрочем, отключив общий майнинг, я могу принудительно включить его на любимых сайтах, благодаря чему им не придётся конкурировать с остальными сайтами.
- Прибыльность майнинга очень нестабильна. Мало кто захочет реализовывать функционал, польза которого очень сомнительна.
Итоги
Описанная выше схема имеет недостатки, но мало кто будет против неё — на крайний случай майнинг можно просто отключить в настройках.
Но те, кто выступают за майнинг, обычно не указывают на сопутствующие проблемы и их решения, а без этого майнинг доставит огромные неудобства пользователю.
Нужно также отметить:
- Браузеры уже начали ограничивать использование CPU в фоновых вкладках, но при большом количестве открытых вкладок они всё-равно дадут большую нагрузку, т. е. это не является полноценной защитой.
Также хорошим решением было бы полностью ограничить использование видеокарты в фоновых вкладок за исключением тем, кому пользователь специально разрешил это.
При этом оба этих решения малоэффективны, когда активных вкладок больше одной. Такое может быть, когда открыто несколько браузеров/окон.
P.S.: Эта статья — не истина в последней инстанции, поэтому было бы интересно услышать другие аргументы, которые я упустил.
P.S.: Обратите внимание: эта статья не выступает за или против майнинга, а лишь указывает недостатки, способы их исправления и преимущества.