ХАКЕР 04 /171/ 2013 Операция на сердце 45ОПТИМИЗАЦИИЗачастую основной целью сборки кастомного ядра становитсяоптимизация производительности. Обычно вендор мобильнойтехники старается сохранить баланс между производительностьюи стабильностью работы, поэтому даже хорошие техникиоптимизации, способные существенно поднять скорость работыдевайса, могут быть отвергнуты производителем только на основаниитого, что после их применения некоторые приложенияначали падать каждый десятый запуск. Само собой, энтузиастовтакие мелочи не смущают, и многие из них готовы применитьк ядру собственной сборки любые опции компилятора, алгоритмыэнергосбережения и задрать частоту процессора настольковысоко, насколько только выдерживает девайс. Среди всех оптимизационныхтехник наиболее распространены четыре:1. Сборка с помощью компилятора Linaro GCC с агрессивнымиопциями оптимизации. Писк сезона, используетсяпочти во всех ядрах. Особую популярностьэтот метод получил после того, как организация Linaroс помощью каких-то непонятных синтетических тестовпродемонстрировала 400%-й (!) прирост производительностиAndroid, собранного с помощью своего компилятора.В реальных условиях эффективность LinaroGCC несколько ниже, но польза от него все же ощутима,так как он реально подгоняет код под особенности архитектурыARMv7 и, если судить по личному опыту, не приноситникаких проблем в стабильность работы ни ядра,ни приложений.2. Расширение возможностей управления частотой и вольтажомцентрального и графического процессоров, а такжеиспользование более эффективного для планшетови смартфонов алгоритма управления энергосбережением.Используется во всех кастомных ядрах и ядрах большинствасерьезных кастомных прошивок. Подробнее этуособенность мы рассмотрим в следующем разделе.3. Активация более эффективных внутренних механизмов,появившихся в последних ядрах Linux. Сюда можно отнестиSLQB аллокатор памяти, который, по мнениюнекоторых разработчиков, может быть более эффективным,чем SLUB, однако никаких экспериментальныхподтверждений этому нет. Такой аллокатор используетсяв ядре GLaDOS для Nexus 7.4. Многие разработчики любят изменять стандартный алгоритмконтроля насыщения TCP (TCP Congrestion control),который регулирует размер TCP-окна на основе множествапараметров, чтобы сделать поток пакетов болееровным и достичь наивысшей скорости передачи данных.Начиная с версии 2.6.19, ядро Linux по умолчаниюиспользует эффективный алгоритм CUBIC, который такжеобычно применяется и в стандартных ядрах Android.Проблема только в том, что CUBIC эффективен в проводныхсетях с высокой скоростью передачи данных, тогдакак для 3G- и Wi-Fi-сетей гораздо лучшим выборомбудет алгоритм Westwood+. Именно этот алгоритм используетсяв ядрах Leankernel для Galaxy Nexus и faux123для Nexus 7, а franko.Kernel для Galaxy S II и Galaxy Nexusтак и вообще включает в себя весь набор доступныхалгоритмов. Просмотреть их список и выбрать нужныйможно с помощью следующих команд:sysctl net.ipv4.tcp_available_congestion_controlsysctl -w net.ipv4.tcp_congestion_control=westwoodЕще один тип оптимизации: изменение стандартногопланировщика ввода-вывода. Ситуация на этом полееще более интересная, так как вместо того, чтобы разобратьсяв принципах работы планировщиков, некоторыеРегулируем вольтажЭнтузиасты готовы применить любыеопции компилятора и задрать частотупроцессора до предела своего девайсаРазгоняем графический процессорсборщики ядер просто читают в Сети документы по I/Oпланировщикамдля Linux и делают выводы. Среди пользователейтакой подход распространен еще более сильно.На самом деле почти все самые производительные и умныеLinux-планировщики совершенно не подходят для Android:они рассчитаны на применение с механическими хранилищамиданных, в которых скорость доступа к данным разнитсяв зависимости от положения головки. Планировщик используетразные схемы объединения запросов в зависимостиот физического положения данных, поэтому запросы к данным,которые располагаются близкок текущему положению головки,будут получать больший приоритет.Это совершенно нелогично в случаес твердотельной памятью, котораягарантирует одинаковую скоростьдоступа ко всем ячейкам. Продвинутыепланировщики принесутна смартфоне больше вреда, чемпользы, а лучший результат покажут самые топорные и примитивные.В Linux есть три подобных планировщика:• Noop (No operation) — так называемый не-планировщик.Простая FIFO очередь запросов, первый запрос будет обработанпервым, второй вторым и так далее. Хорошо подходитдля твердотельной памяти и позволяет справедливо распределитьприоритеты приложений на доступ к накопителю.Дополнительный плюс: низкая нагрузка на процессор в силуну очень простого принципа работы. Минус: никакого учетаспецифики работы девайса, из-за чего могут возникнутьпровалы производительности.• SIO (Simple I/O) — аналог планировщика Deadlineбез учета близости секторов друг к другу, то есть разработанныйспециально для твердотельной памяти. Двеглавные изюминки: приоритет операций чтения над операциямизаписи и группировка операций по процессамс выделением каждому процессу кванта времени на выполнениеопераций. В смартфонах, где важна скоростьработы текущего приложения и преобладание операцийчтения над записью, показывает очень хорошую производительность.Доступен в Leankernel, ядре Matr1xдля Nexus 4 и SiyahKernel.УМНЫЙРЕГУЛИРОВЩИКВ SoC’ах OMAP35XX,используемых, например,в Galaxy S II и GalaxyNexus, есть функцияSmartReflex, котораявыполняет роль умнойсистемы регулировкивольтажа при изменениинагрузки на процессор.По сути, она избавляетот необходимости тонкоготюнинга вольтажапользователем.
X-Mobile46 ХАКЕР 04 /171/ 201346Главный экранутилиты настройкиядер Trickster MODсброса изменившегося содержимого открытых файлов на диск.Существует мнение, что без fsync система будет реже обращатьсяк накопителю и таким образом удастся сохранить времяпроцессора и заряд батареи. Довольно спорное утверждение:fsync в приложениях используется не так уж и часто и толькодля сохранения действительно важной информации, зато егоотключение может привести к потере этой же информациив случае падения операционной системы или других проблем.Возможность отключить fsync доступна в ядрах franco.Kernelи GLaDOS, а для управления используется файл /sys/module/sync/parameters/fsync_enabled, в который следует записать 0для отключения или 1 для включения. Повторюсь, что использоватьэту возможность не рекомендуется.РАЗГОН, ВОЛЬТАЖ И ЭНЕРГОСБЕРЕЖЕНИЕРазгон популярен не только среди владельцев стационарныхкомпов и ноутбуков, но и в среде энтузиастов мобильной техники.Как и камни архитектуры x86, процессоры и графическиеядра мобильной техники отлично гонятся. Однако сам способразгона и предпринимаемые для его осуществления шагиздесь несколько другие. Дело в том, что стандартные драйверыдля SoC’ов, отвечающие за энергосбережение и изменение ча-Несколько интересных аддоновДОБАВЛЯЕМ В ЯДРО НОВЫЕ ФУНКЦИИСамо собой, кроме оптимизаций, твиков и разных систем расширенного управленияоборудованием, в кастомных ядрах также можно найти совершенно новуюфункциональность, которой нет в стандартных ядрах, но которая может быть полезнапользователям.В основном это различные драйверы и файловые системы. Например,некоторые ядра включают в себя поддержку модуля CIFS, позволяющегомонтировать Windows-шары. Такой модуль есть в ядре Matr1xдля Nexus S, faux123 для Nexus 7, SiyahKernel и GLaDOS. Сам по себеон бесполезен, но в маркете есть несколько приложений, позволяющихзадействовать его возможности.• ROW (READ Over WRITE) — планировщик, специально разработанныйдля мобильных устройств и добавленный в ядровсего несколько месяцев назад. Основная задача: первоочереднаяобработка запросов чтения, но справедливоераспределение времени и для запросов записи. Считаетсялучшим на данный момент планировщиком для NANDпамяти,по умолчанию используется в Leankernel и Matr1x.Стоит сказать, что почти все стандартные прошивки и половинакастомных до сих пор используют ядро со стандартнымдля Linux планировщиком CFQ, что, впрочем, не так уж и плохо,поскольку он умеет правильно работать с твердотельными накопителями.С другой стороны, он слишком сложен, создаетбoльшую нагрузку на процессор (а значит, и батарею) и не учитываетспецифику работы мобильной ОС. Еще один популярныйвыбор — это планировщик Deadline, который не хуже SIO, но избыточен.Посмотреть список доступных планировщиков можнос помощью такой команды:# cat /sys/block/*/queue/schedulerДля изменения применяется такая (где row — это имя планировщика):# for i in /sys/block/*/queue/scheduler; do echorow > $1; doneНекоторые сборщики ядер применяют и другой вид оптимизации,связанный с вводом-выводом. Это отключение системноговызова fsync, применяемого для принудительногоМногие ядра имеют в своем составе поддержку так называемой технологииzram, позволяющей зарезервировать небольшой объем оперативнойпамяти (~10%) и использовать ее в качестве сжатой области подкачки.Происходит как бы расширение количества памяти, без каких-либосерьезных последствий для производительности. Доступно в Leankernel,включается с помощью Trickster MOD или командой zram enable.Еще одна полезность — это включение в ядро драйвера ntfs-3g (точнее,в пакет с ядром, сам драйвер работает как Linux-приложение), которыйнеобходим для монтирования флешек, отформатированных в файловуюсистему NTFS. Этот драйвер есть в ядрах faux123 и SiyahKernel. Обычноон задействуется автоматически, но, если этого не происходит, можновоспользоваться приложением StickMount из маркета.Две другие интересные функции — это Fast USB charge и Sweep2wake.Первая — принудительное включение режима «быстрой зарядки», дажеесли смартфон подключен к USB-порту компьютера. В силу техническихограничений такой режим не может быть включен одновременно с доступомк карте памяти. Функция Fast USB charge позволяет включитьэтот режим по умолчанию, отключив при этом доступ к накопителю.Sweep2wake — это новый способ будить устройство, изобретенныйавтором Breaked-kernel. Смысл его в том, чтобы включать смартфон,проведя пальцем по клавишам навигации, располагающимся нижеэкрана, либо по самому экрану. Это действительно удобная функция,но в результате ее включения сенсор будет оставаться активным дажево время сна устройства, что может заметно разряжать батарею.