Библиотека сайта rus-linux.net
MemShrink
Глава 5 из книги "Производительность приложений с открытым исходным кодом".
Оригинал: MemShrink
Автор: Kyle Huey
Перевод: А.Панин
Не вами допущенная ошибка не является чужой проблемой
За несколько месяцев мы хорошо изучили приемы, применяемые для снижения потребления памяти и устранения утечек памяти в Firefox. При этом не все из наших пользователей замечали улучшения, связанные с нашей работой. Стало понятно, что значительное количество проблем с памятью, с которыми сталкивались наши пользователи, возникало в дополнениях. В нашей системе регистрации сообщений об ошибках в конце концов скопилось более 100 подтвержденных сообщений о дополнениях, которые вызывали утечки памяти.
Исторически организация Mozilla выбрала подход, согласно которому программные продукты должны использовать дополнения. Мы позиционировали веб-браузер Firefox как браузер с расширяемыми возможностями, совместно с которым может использоваться огромный набор дополнений. Но тогда, когда пользователи сообщали о проблемах с производительностью, вызванных этими дополнениями, мы просто советовали пользователям не применять их. Большое количество дополнений, вызывающих утечки памяти, сделало такой подход неприемлемым. Многие дополнения для Firefox распространяются с помощью ресурса addons.mozilla.org
(AMO) организации Mozilla. В рамках ресурса AMO используется политика проверки дополнений, направленная на выявление стандартных проблем. Мы начали понимать масштаб проблемы в тот момент, когда участники группы проверки дополнений ресурса AMO начали тестировать дополнения на наличие утечек памяти с помощью таких инструментов, как страница about:memory
. Большое количество проверенных дополнений имело проблемы, приводящие к таким последствиям, как создание зомби-подфрагментов памяти. Мы начали связываться с авторами дополнений, после чего сформировали перечень одобренных приемов разработки и стандартных ошибок, приводящих к появлению утечек памяти. К сожалению, данное занятие не увенчалось большим успехом. Хотя в некоторые дополнения и были внесены исправления их авторами, большая часть дополнений так и не была исправлена.
Существовал ряд причин, по которым эта работа не увенчалась успехом. Не все дополнения регулярно обновляются. Авторы дополнений являются энтузиастами и ведут разработку в соответствии со своими графиками работы и приоритетами. Поиск утечек памяти может быть сложным занятием, особенно в том случае, если вы прежде всего не можете добиться повторения проблемы. Описанный нами ранее инструмент для создания дампов памяти является очень мощным и упрощает сбор информации, но анализ выходных данных все еще сложен, поэтому не имеет смысла ожидать его выполнения от авторов дополнений. Наконец, не существует серьезных стимулов к исправлению утечек памяти. Никто не хочет распространять некачественное программное обеспечение, но вы также не можете исправить все ошибки в нем. При этом люди могут быть более заинтересованы в выполнении той работы, которая кажется важной именно им, а не нам.
Мы пытались создать стимулы для исправления утечек памяти в течение длительного промежутка времени. Дополнения приводили и к другим проблемам с производительностью продуктов организации Mozilla, поэтому мы обсуждали возможность вывода информации о производительности дополнений на ресурсе AMO или в самом браузере Firefox. В теории возможность информирования пользователей о воздействии установленных или выбранных для установки дополнений на производительность могла помочь в выборе того, какие дополнения следует использовать. При этом первой проблемой является тот факт, что пользователи такого неспециализированного программного обеспечения, как веб-браузеры обычно не могут сделать выводы о воздействии дополнения на производительность браузера исходя из этой информации. Скольким из 400 миллионов пользователей Firefox понятна природа утечек памяти, а также то, стоит ли сталкиваться с ней из-за желания использовать некоторые случайные дополнения? Во-вторых, подобное исследование эффекта снижения производительности из-за использования дополнений требует вмешательства людей из множества различных частей сообщества, сформированного вокруг продуктов организации Mozilla. Люди, находящиеся в сообществе и ответственные за работу с дополнениями, например, не задумывались о возможности удаления дополнений из списка. Наконец, большой процент дополнений для Firefox вообще составляют дополнения, которые не устанавливается через ресурс AMO, а поставляются в составе стороннего программного обеспечения. У нас не было рычагов воздействия на такие дополнения за исключением попытки их блокировки. По этим причинам мы отвергли нашу идею о создании подобных стимулов.
Другая причина, по которой мы отказались от создания стимулов для исправления утечек памяти в дополнениях заключается в том, что мы обнаружили совершенно иной способ решения проблемы. Мы окончательно сформулировали методику "удаления фрагментов памяти", оставшихся от дополнений с утечками памяти в Firefox. В течение длительного промежутка времени мы считали, что подобные действия не могут осуществляться без приведения в нерабочее состояние множества дополнений, но мы все равно проводили эксперименты в этой области. В конце концов нам удалось создать реализацию технического решения, которая позволила возвращать память без неблагоприятного воздействия на большинство дополнений. Мы использовали границы между подфрагментами памяти для "разрушения" связей между подфрагментами памяти, относящимися к подсистеме chrome, и подфрагментами памяти, относящимися к содержимому страницы в момент, когда происходит переход на страницу или закрытие вкладки. В этом случае объект, относящийся к подсистеме chrome, остается в прежнем состоянии даже в том случае, когда он не ссылается ни на что. Изначально мы считали, что будут возникать проблемы тогда, когда такие объекты будут использоваться со стороны кода, но выяснилось, что по большей части эти объекты впоследствии не используются. По сути дополнения случайным образом производили бессмысленное кэширование данных веб-страниц, поэтому автоматическое удаление сохраненных ими данных не имело значительных последствий. Таким образом, мы долго искали социальное решение технической проблемы.
Продолжение статьи: Постоянное присутствие является ценой превосходства.