Как стать автором
Обновить

Приручаем и прокачиваем огнелиса: The Ultimate Guide

Время на прочтение 13 мин
Количество просмотров 81K
Подчини себе этого 9-хвостого лиса

Лирическое вступление


Не люблю гонку версий, своей бессмысленностью отдаленно напоминающую гонку вооружений. Не успели как следует довести до ума текущую версию — выпускают новую, с новыми багами, уязвимостями и «особенностями». Для таких как я — любителей стабильных и проверенных решений для корпоративной среды, да и для себя тоже — у команды Мозилы есть сборка типа ESR: в течение длительного времени для нее выходят обновления, устраняющие ошибки и уязвимости, сама же major версия браузера не обновляется! Вот ссылка на страницу оф.сайта, откуда можно скачать эту замечательную ESR-версию (достигается путем не слишком очевидных ходов), также, ESR можно скачать с официального FTP ftp.mozilla.org/pub/firefox/releases/latest-esr/
Только что вышла давно мной ожидавшаяся 17-я ESR версия (предыдущая была только 10-я). В связи с этим событием решил написать подробное руководство по оптимизации нашего (не)любимого браузера — с разбором всех параметров, что каждый из них делает и откуда он получен.


Часть 1. Чтоб Мозила не тормозила


1. К своему удивлению обнаружил: характерное торможение, с которым многие, наверно, сталкивались, вызывается встроенным скриптом, определяющим системные настройки прокси.
Если прокси нет — указываем это явно: «настройки — дополнительно — сеть — соединение» — «без прокси». Если наш лис работает в корпоративной среде — по возможности задаем явно прокси или скрипт proxy.pac
2. Минимум дополнений (addons): лишних не устанавливаем, из тех что установлены держим включенными только те, которые реально нужны. Помним: лишний плагин — лишняя затрата вычислительных ресурсов при прорисовке каждой страницы. Собственно плагины (plugins): отключаем по максимуму все, и в первую очередь dotnet, DRM, java quick start. В условиях корпоративной среды принимаем меры, чтобы эти плагины вообще не появлялись в списке установленных.
3. Ограничение объема и автоматическая оптимизация базы данных places — файла places.sqlite. Первое достигается параметром max_pages (см.ниже), второе — (теоретически) происходит штатно раз в месяц. В совеременных версиях ФФ, к сожалению, в интерфейсе не предусмотрены настройки для ограничения времени хранения и размера истории посещений страниц. Естественно, пробел этот могут восполнить аддоны. В качестве альтернативы принудительному заданию ограничения числа страниц в истории, рекомендую аддон PlacesCleaner: он производит очистку и оптимизацию БД с заданным интервалом (в днях). Если нужна только частая оптимизация, а число страниц уже задано жестко через конфиг, может быть интересен аддон Vacuum Places Improved.
4. Ограничение размера кэша до разумного размера — явно указать в настройках (или через pref). Думаю, понятно каждому: гигабайт распыленных по диску файлов и индексы всего этого скорости работы не прибавят.

Часть 2. Избавляемся от нежелательного контента


Давно прошли те времена, когда проблемой являлась загрузка, собственно, рекламных баннеров в формате gif. Сейчас зло — счетчики и централизованные баннерные сети, шпионящие, еще, к тому же, за пользователем: во-первых, скрипты, которые тяжелее «полезной нагрузки» — самой рекламной графики, во-вторых, централизованный характер: повышенная нагрузка на их сервер то и дело приводит к задержке подгрузки их контента, а не загрузив его, браузер откладывает рендеринг страницы — в результате мы ждем даже при быстром интернете… А засилье флэш-рекламы? Оно представляет собой «сейчас», по сравнению с «тогда» несопоставимо большую проблему: достаточно посмотреть, сколько памяти уходит на процесс plugin-container — сравнимо с самим браузером: новые версии adobe flash player стали очень прожорливыми и каждый лишний флэш-баннер следует расценивать как лишнее открытое приложение!
Ниже приводятся варианты решений проблемы нежелательного контента, наиболее интересных с технической точки зрения:
1. Семейство аддонов adblock — наиболее удобный и, как следствие, популярный инструмент.
Подробности
Из всего их многообразия рекомендую обратить внимание на 2: Adblock plus — самая свежая версия аддона, и на его альтернативу Adblock edge. Достоинства: начинают блокировать рекламу сразу после установки («из коробки»), умеют блокировать любой контент (картинки, флэш, скрипты) и даже убирать указанные в черном списке HTML-контейнеры прямо из страницы (по id, class...), можно как добавлять готовые подписки, так и составлять свои правила.
Недостатки: добавленная по умолчанию подписка RuAdlist+Easylist (внимание!) не блокирует счетчики; готовые наборы правил из подписок представляют из себя слишком длинные списки, что чревато растратой вычислительной мощности и оперативной памяти; нужно изучать собственный синтаксис Адблока при желании создать своё правило вручную.
Для легкого решения проблемы со счетчиками, добавляем в подписку список «Против счётчиков»: https://ruadlist.googlecode.com/svn/trunk/cntblock.txt, он легковесный — 12 кб и является единственной упомянутой здесь подпиской, которая не приводит к повышению потребления ресурсов браузером. Но он не блокирует скрипт google-analytics, поэтому требуется еще добавить правило ||google-analytics.com/ga.js
Есть еще список BitBlock — чтобы не грузились плагины от социальных сетей — кнопки фейсбучных лайков, google+ и т.п., http://ruadlist.googlecode.com/svn/trunk/bitblock.txt. Все эти дополнительные фильтры можно установить в 1 клик на странице их разработчика: https://code.google.com/p/ruadlist/
Необходимо помнить, что подписки содержат огромное число правил, в основном ненужных, из-за чего ощутимо замедляется загрузка тяжелых и сложных страниц (вроде результатов поиска картинок в яндексе и гугле) увеличивается потребление памяти: до 120 Мб с тремя подписками против 56 Мб с Адблоком без правил (браузер показывает 1 вкладку с пустой страницей). Если при наличии пары прямых рук мы не хотим жертвовать скоростью и тратить лишнюю память — удаляем все подписки (кроме, пожалуй, «против счетчиков») и создаем правила сами: вручную универсальные правила, а на часто посещаемых сайтах — в визуальном режиме блокируем все баннеры, в первую очередь флэш (у адблока есть возможность показать список элементов и иногда — создавать правило кликом мыши непосредственно по нежелательному элементу). Результат нашей работы хранится в профиле ФФ в поддиректории adblockplus (adblocklite) и эти настройки теперь можно тиражировать вместе с самим плагином на другие *upd* И еще про adblock plus: для повышения производительности обязательно отключайте в настройках (кнопка аддона, выпадающее меню) «считать срабатывания фильтров»! Адблок при каждом попадании перелопачивает мегабайтный (в случае подписок) patterns.ini — заглянул туда и ужаснулся. Не случайно Adblock edge и adblock lite поставляются с отключенным по дефолту подсчетом срабатываний фильтров. Подробнее об оптимизации Адблока читайте здесь.

2. noscript, yesscript — блокировка скриптов, помогает победить такое зло как скрипты счетчиков и баннерных сетей.
Подробности
noscript работает по принципу белого списка, есть предустановленный белый список, yesscript — по принципу черного списка.
Недостатки для noscript: специализация на блокировке скриптов, невозможность компромисса: блокирует скрипты даже для домена открытой на данной вкладке страницы, что обязательно испортит работоспособность многих сайтов, а в случае установки галки «полностью разрешить выполнение javascript» (по-моему, единственно приемлемый режим) и добавления отдельных скриптов (например, счетчиков) в черный список — сам черный список увидеть в настройках (или задать его заранее) невозможно. Ну а yesscript — реализующий адекватный алгоритм черного списка — по скудности настроек способен разочаровать даже фаната минимализма: есть только список урлов (рег. выражений?) скрипты откуда следует блокировать, его нужно создавать самостоятельно. Для сравнения: Adblock, если в нем пользоваться только самописными правилами, точно также заблокирует скрипт, но кроме него — еще и картинки, и флэш, и целые блоки HTML кода прямо в странице. Разница очевидна.

3. imglikeopera — очень интересный плагин, незаслуженно обделенный популярностью. Блокирует картинки и флэш.
Подробности
Идея заимствована из «Оперы» — кнопка, управляющая показом картинок.
Достоинства: умеет принудительно кэшировать графический контент на длительный срок, поддерживает регулярные выражения. Недостатки: не содержит предустановленных наборов правил — всё задается вручную, не управляет скриптами (но был экспериментально допилен мной, чтобы добавить и эту возможность — впечатления вызывает смешанные), в исходный код страницы — в тэги добавляет лишние параметы «ilo-full-src» и при сохранении страниц они там присутствуют.

4. Параметр конфигурации plugins.click_to_play
Подробности
и простейший аддон switch-plugins_click_to_play, создающий кнопку, управляющую данным параметром. Очень эффективный и совместимый с предыдущими решениями способ устранить отъедание памяти и загрузку процессора флэш-контентом в лице процесса plugin-container. При включенном click_to_play на месте флэш-баннера появляется серый блок с надписью «щелкните здесь для включения плагина», а в начале адресной строки появляется уведомление, кликнув по которому можно настроить запуск плагина для данного сайта.


Часть 3. Правильные настройки по дефолту


Самый простой способ развертывания ФФ с заданными настройками — положить js-файл, аналогичный prefs.js в профиле в директорию [путь установки ФФ] / defaults / preferences. Я его называю так же как и в профиле — prefs.js, но имя не принципиально, главное чтобы было расширение .js
Итак, создаем js-файл со следующим содержимым:
* upd *
# Mozilla User Preferences

pref("app.update.enabled", false);
pref("browser.cache.memory.max_entry_size", 256);
pref("browser.cache.memory.capacity", 4096);
pref("browser.display.show_image_placeholders", false);
pref("browser.download.manager.retention", 1);
pref("browser.download.useDownloadDir", false);
pref("browser.feeds.showFirstRunUI", false);
pref("browser.newtabpage.enabled", false);
pref("browser.places.importBookmarksHTML", false);
pref("browser.privatebrowsing.dont_prompt_on_enter", true);
pref("browser.rights.3.shown", true);
pref("browser.safebrowsing.enabled", false);
pref("browser.safebrowsing.malware.enabled", false);
pref("browser.search.update", false);
pref("browser.sessionhistory.max_total_viewers", 1);
pref("browser.shell.checkDefaultBrowser", false);
pref("browser.startup.page", 0);
pref("browser.tabs.animate", false);
pref("browser.xul.error_pages.expert_bad_cert", true);
pref("config.trim_on_minimize", true);
pref("dom.event.contextmenu.enabled", false);
pref("extensions.blocklist.enabled", false);
pref("extensions.shownSelectionUI", true);
pref("extensions.update.enabled", false);
pref("extensions.update.notifyUser", false);
pref("extensions.pendingOperations", false);
pref("geo.enabled", false);
pref("gfx.direct2d.force-enabled", true);
pref("gfx.font_rendering.directwrite.enabled", true);
pref("layers.acceleration.force-enabled", true);
pref("intl.charsetmenu.browser.cache", "windows-1251, UTF-8");
pref("intl.charset.default", "windows-1251");
pref("intl.charsetmenu.browser.cache.size", 2);
pref("network.cookie.prefsMigrated", true);
pref("network.dns.disableIPv6", true);
pref("network.http.pipelining", true);
pref("network.http.pipelining.max-optimistic-requests", 2);
pref("network.http.proxy.pipelining", true);
pref("network.http.request.max-start-delay", 1);
pref("network.prefetch-next", false);
pref("places.history.expiration.max_pages", 400);
pref("plugins.hide_infobar_for_outdated_plugin", true);
pref("privacy.donottrackheader.enabled",true);
pref("security.warn_entering_weak", false);
pref("security.warn_viewing_mixed", false);
pref("toolkit.telemetry.prompted", true);

Файлов js в defaults / preferences может быть несколько. Это удобно: опциональный блок параметров локализован в отдельном файле, его можно подложить на конкретный ПК в сети или удалить оттуда.

Легко сделать свой дистрибутив ФФ для Windows с правильными настройками: распаковываем инсталлятор, директорию win32 можно смело удалить, в директории core находится то, что запишется в program files. Кладём наш js-файл с правильными настройками в core\defaults\preferences. Можно сразу удалить maintenanceservice_installer.exe и maintenanceservice.exe — не засоряем ПК лишними сервисами. Получившийся распакованный дистрибутив можно устанавливать вручную или развертывать всеми возможными способами — точно так же, как и исходный exe-дистрибутив: setup.exe воспринимает все те же ключи.

Часть 4. Подробно о том, что каждый параметр делает


Источники:
{1} решение найдено мной
{2} www.latestonnet.com/2012/01/17/optimize-firefox-to-run-4-times-faster-than-before.html
{3} sonikelf.ru/optimizuruem-firefox
{4} egonitron.com/2007/05/25/the-truth-about-the-firefox-pipelining-trick
{5} techlogon.com/2012/12/02/how-to-speed-up-firefox-tweaking-guide
Первоисточник (правда, для старых версий): http://kb.mozillazine.org/Category:Preferences

Для начала о стратегии. В отличие от множества горе-оптимизаторов, я не стремлюсь поменять каждую настройку во всём подряд, включая все тонкости поведения системы на низком уровне. Вместо этого, осознанно и со здравым смыслом прорабатываются следующие направления:
1) предотвращаем причины «тормозов»
2) отключить весь лишний и мешающий функционал — уведомления, большого брата антиспуфинг, ipv6 etc.
3) экономия оперативной памяти
4) включить HTTP 1.1, но без экстремизма

нет назойливым обновлениям без спросу
pref("app.update.enabled", false);
pref("browser.search.update", false);
pref("extensions.update.enabled", false);
pref("extensions.update.notifyUser", false);
pref("extensions.pendingOperations", false);
pref("extensions.blocklist.enabled", false);
{1}

оптимизация расхода памяти
pref("browser.sessionhistory.max_total_viewers", 1);
количество страниц, сохраняемых в оперативной памяти, для быстрого перехода назад — уменьшая значение экономим память; рекомендуют ставить 0, но я (как и в {2}) считаю оптимумом 1: в подавляющем большинстве случаев нам нужен возврат именно на 1 шаг, и здесь лис порадует нас своей скоростью;
pref("browser.cache.memory.max_entry_size", 256);
pref("browser.cache.memory.capacity", 4096);
pref("config.trim_on_minimize", true);
размер кэша в оперативной памяти {1}, {3}
выгрузка страниц памяти при сворачивании окна {3}

Внимание: browser.cache.memory.capacity = 4096 означает, что будет выделено 4 Мб на кэш в памяти (значение в кб). Если свободной памяти заведомо много, рационально ставить значения в разы больше. С другой стороны, минимальный размер кэша означает, что в корпоративной среде всем будет хватать памяти…
browser.cache.memory.max_entry_size означает максимальный размер кэшируемого в память объекта (значение в кб). По идее, чем меньше, тем эффективнее расходуется память. Часто (как в {3}) неправильно принимают за параметр, определяющий размер самого кэша. Подтверждение моих слов — в самом браузере, смотреть тут: about:cache?device=memory
Видно, что заданный нами browser.cache.memory.capacity в точности отображается в строке «Maximum storage size».

отучаем от лишних вопросов
pref("browser.shell.checkDefaultBrowser", false);
нет назойливым предложениям сделаться браузером по умолчанию {1}
pref("browser.feeds.showFirstRunUI", false);
pref("browser.rights.3.shown", true);
pref("extensions.shownSelectionUI", true);
pref("toolkit.telemetry.prompted", true);
pref("browser.places.importBookmarksHTML", false);
pref("browser.privatebrowsing.dont_prompt_on_enter", true);
firefox не показывает саморекламу и ненужные напоминания при первом запуске {1}

противодействуем сбору информации
pref("geo.enabled", false);
pref("browser.safebrowsing.enabled", false);
pref("browser.safebrowsing.malware.enabled", false);
pref("privacy.donottrackheader.enabled",true);
отключить шпионаж Google и проверку урлов на фишинг — ускоряет работу: браузер делает меньше ходов {1}
посылать заголовок «do not track» {1}

интерфейс, юзабилити
pref("browser.startup.page", 0);
pref("dom.event.contextmenu.enabled", false);
pref("browser.download.manager.retention", 1);
pref("browser.download.useDownloadDir", false);
pref("places.history.expiration.max_pages", 400);
pref("browser.newtabpage.enabled", false);
pref("browser.tabs.animate", false);
pref("browser.display.show_image_placeholders", false);
открываем пустую страницу по дефолту — идеально для корпоративной среды{1}
запрещаем сайтам отключать контекстное меню {1}
лис не гадит под себя при скачивании задается вопрос куда качать {1}
очищаем историю загрузок при выходе из ФФ {1}
ограничиваем максимальное число гарантированно сохраняемых записей в истории до 400: такой подход ограничения размера базы places без плагинов — единственно возможный на современных версиях ФФ (понято из исходников и подтверждено экспериментально) {1}
в новом табе показываем по умолчанию пустую страницу без тайлов {1}
отключаем анимацию табов {5}
не показываем места для картинок — ускоряет прорисовку {5}
pref("plugins.click_to_play",true);
опционально: не загружаем плагины автоматически — устраняем проблему прожорливого флэш контента{1}

аппаратное ускорение графики
pref("gfx.direct2d.force-enabled", true);
pref("gfx.font_rendering.directwrite.enabled", true);
pref("layers.acceleration.force-enabled", true);
принудительное задействование графического ускорителя: браузер более требователен к видеодрайверу и GPU, чем игры!? Говорим твёрдое «нет» этому недоразумению! {1}

кодировки
pref("intl.charsetmenu.browser.cache", "windows-1251, UTF-8");
pref("intl.charset.default", "windows-1251");
pref("intl.charsetmenu.browser.cache.size", 2);
какие наборы символов кэшируем
кодировка страниц по умолчанию {1}
сколько наборов символов кэшируем (по умолчанию 5) {1}

сетевые настройки
pref("network.dns.disableIPv6", true);
pref("network.http.pipelining", true);
pref("network.http.proxy.pipelining", true);
pref("network.http.request.max-start-delay", 1);
pref("network.http.pipelining.max-optimistic-requests", 2);
# опционально, экспериментально
# pref("network.http.max-persistent-connections-per-server", 8);
# pref("network.prefetch-next", false);
{1-5}
отключает никому здесь не нужный IPv6
включение HTTP1.1 (множественные запросы в одном соединении) при прямом соединении и через прокси соответственно.
задержка перед превышением допустимого числа keep-alive соединений, по умолчанию 10 (сек), в {2} рекомендуется 0, я считаю, что лучше поставить не 0, а 1, сохранив некоторую задержку
снижение max-optimistic-requests с 4 до 2 по результатам моих экспериментов устраняет задержку в открытии страниц при работе через HTTP1.1;
рекомендуют увеличение с 6 (умолч.) до 8 макс. числа постоянных соединений с 1 сервером, чего я лично делать не рекомендую, наоборот, можно попробовать снижение до 4 или даже 2 (как в IE5 и 6, у которого никогда не было проблем с HTTP1.1);
отключение предзагрузки следующих страниц, в условиях корпоративной среды — нужная настройка

«безопасность»
pref("security.warn_entering_weak", false);
pref("security.warn_viewing_mixed", false);
pref("browser.xul.error_pages.expert_bad_cert", true);
отключение бесполезных вопросов о слабом шифровании и смешанном контенте, на которые все пользователи всё равно ответят «да» {1}
улучшаем юзабилити в предупреждении о самоподписанном сертификате — экономим клики (убрать полностью это предупреждение пока не удается) {1}

прорисовка страниц
pref("content.notify.backoffcount", 5);
pref("content.notify.ontimer", true);
pref("content.interrupt.parsing", true);
pref("content.notify.interval", 750000);
низкоуровневые настройки прорисовки страниц до их загрузки;
часто рекомендуют content.notify.backoffcount = 5, но никто не говорит, что нужно еще включать content.notify.ontimer, чтобы первая настройка на что-то влияла
(экспериментально, привожу этот блок в связи с тем, что раньше
постоянно рекомендовали content.notify.backoffcount = 5)

todo: найти бы способ отучить ФФ ругаться на недействительный сертификат, но пока такой настройки я не нашел
Теги:
Хабы:
+57
Комментарии 90
Комментарии Комментарии 90

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн