Запуск Linux на PlayStation 3. : Часть 2. Работа с памятью


Приставка Sony PlayStation 3 (PS3) может работать под управлением операционной системы Linux®, но для ее нормального функционирования требуется дополнительная настройка. В этой статье, второй из серии, автор рассматривает вопросы оптимизации системной памяти PS3.

В первой статье я рассказал о том, что представляет собой операционная система Linux, запущенная на PS3, и о сильных и слабых сторонах ее работы в качестве платформы для разработки приложений. Во второй статье я рассмотрю некоторые вещи, которые могут существенно улучшить производительность системы PS3 под управлением Linux.

Не существует универсальных советов, которые бы одинаково хорошо подходили для всех. Если вы работаете с графикой, то вы просто не сможете отказаться от использования графической среды X. С другой стороны, если вы не занимаетесь подобными вещами, то нет лучшего способа освободить системную память, чем отказаться от использования X.

Если вы привыкли к настольным системам, которым никогда не требовались дополнительные разделы подкачки, вам может показаться странным, что вопросам работы с памятью уделяется такое внимание. Однако в действительности проблема заключается в том, что PS3 не обладает достаточным объемом системной памяти, чтобы обеспечить комфортную работу современной настольной ОС Linux, установленной "из коробки". При использовании стандартной установки Fedora 7 большая часть системного (и вашего) времени уходит на подкачку данных. Подкачка очень сильно снижает производительность системы. В системе PS3, обладающей 2,5-дюймовым жестким диском, доступ к которому осуществляется при помощи гипервизора, и имеющей оперативную память, скорость которой существенно выше, чем у большинства настольных ПК, этот контраст еще более заметен, чем в случае с обычной настольной системой.

Я должен сделать еще одно замечание: при использовании ядра версии 2.6.21, установленного по умолчанию в моей тестовой системе, процесс перезагрузки системы не был стабильным. Установка ядра версии 2.6.23, взятого с компакт-диска "Addons CD" или полученного путем обновления Fedora с помощью стандартного менеджера обновлений, исправляет эту проблему. Вероятно, установить новую версию ядра с компакт-диска "Addons CD" будет лучшим решением.

Освобождаем память

Пришло время раскрыть эту важную тему. Большинство пользователей настольных систем Linux уже давно забыли о необходимости выполнять какие-то специальные действия для освобождения памяти. Несмотря на то, что системные процессы стремились занимать всю доступную память даже в те времена, когда машина с 64 МБ ОЗУ считалась мощным сервером, на тот момент просто не использовалось такое количество программ, как сейчас, и поэтому не было необходимости в установке большого количества памяти. Однако PS3 является системой, в которой объем системной памяти играет существенную роль, а Fedora 7 при всех своих достоинствах не рассчитана на работу в системах с малым объемом ОЗУ.

Чтобы уменьшить загрузку памяти, нужно начать с выявления наиболее ресурсоемких процессов. Проще всего сделать это при помощи команды top, которая в реальном времени отображает на экране список системных процессов. По умолчанию команда top показывает вам процессы, отсортированные по степени их влияния на загрузку CPU, что, безусловно, удобно для выполнения других задач оптимизации, но не очень хорошо подходит для нашего случая. Обратите внимание на то, что команда top выводит суммарную статистику использования памяти. Например, на PS3 с запущенной средой X и некоторыми отключенными службами я получил следующую статистику:

Листинг 1. Неужели моя система действительно использует столько памяти?

                
Mem: 219192k total, 213692k used, 5500k free, 7232k buffers
Swap: 4192956k total, 0k used, 4192956k free, 89468k cached

Запустите в командной оболочке команду top, нажмите O (это заглавная английская буква, означающая сортировку – "order by"), затем нажмите q и клавишу ввода. В этом примере буква q означает "резидентный размер" и показывает вам фактический объем памяти, используемой процессом. Другим возможным выбором может быть опция o (виртуальный размер).

Теперь вы должны увидеть список процессов, отсортированный по размеру фактически используемой памяти. Ниже приведена часть списка, полученного на тестовой машине.

Листинг 2. По-видимому, моя система действительно использует столько памяти

                
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3259 root 20 0 65424 36m 4996 S 2 17.2 0:01.39 Xorg
3422 seebs 20 0 92900 24m 20m S 0 11.6 0:01.22 nautilus
3439 seebs 20 0 58600 24m 22m S 0 11.5 0:00.36 nm-applet
3473 seebs 20 0 56620 24m 14m S 0 11.4 0:01.22 /usr/bin/sealer
3420 seebs 20 0 50248 21m 18m S 0 10.2 0:01.90 gnome-panel
3476 seebs 20 0 48988 14m 10m S 1 6.9 0:00.64 gnome-terminal
3445 seebs 20 0 33104 14m 9464 S 0 6.7 0:00.40 puplet
3453 seebs 20 0 45764 13m 12m S 0 6.4 0:00.22 gnome-power-man
3414 seebs 20 0 41920 9696 8052 S 0 4.4 0:00.29 gnome-settings-
3418 seebs 20 0 22200 8996 7316 S 0 4.1 0:00.33 metacity
3297 seebs 20 0 40544 8384 7088 S 0 3.8 0:00.32 gnome-session
3432 seebs 20 0 20076 6120 5244 S 0 2.8 0:00.10 bluetooth-apple
3444 seebs 20 0 14692 6060 3532 S 0 2.8 0:00.24 python

Практически всю первую десятку "пожирателей" памяти составляют процессы среды X. Вот почему, если вы действительно хотите освободить память, одним из первых ваших действий могло бы стать закрытие X. Принимая во внимание количество GNOME-приложений в вышеприведенном списке, у вас может возникнуть желание попробовать работать с KDE, но, боюсь, это вам не даст ровным счетом ничего, поскольку KDE занимает примерно столько же памяти PS3, что и GNOME.

Фактически, если вам крайне необходимо работать в среде X, то лучше всего поступить следующим образом: не пользоваться всеми возможностями, предлагаемыми графическим окном входа в X, а вместо этого запускать X из консоли, с менее ресурсоемким оконным менеджером и меньшим количеством дополнительных программ. Но как это сделать? Вашим первым шагом будет выход из программы top обратно в командную строку — для этого просто нажмите q.

Использование уровней запуска

Уровни запуска (runlevels) — это функциональная возможность, для изучения которой у многих пользователей Linux никогда не было повода. Уровни запуска главным образом унаследованы от операционной системы System V UNIX®, хотя, конечно, некоторые отличия имеются. Уровень запуска — это определенный набор совместно выполняемых системных служб. По историческим причинам обычная настольная среда Linux, которая работает с графической оболочкой входа в систему, запускающей менеджер Gnome или KDE, называется runlevel 5. На обычных изолированных рабочих станциях без X часто используется уровень runlevel 2. Теоретически вы можете изменить системный уровень запуска, просто выполнив команду init , расположенную в папке /sbin. Например, выполнив (от имени пользователя root) команду /sbin/init 2, вы переведете систему на уровень runlevel 2 (обычно это достигается путем остановки всех служб, не используемых на уровне runlevel 2, и последующего запуска всех служб, используемых на этом уровне).

Уровень запуска по умолчанию указан в строке файла /etc/inittab, которая выглядит примерно следующим образом:

Листинг 3. Уровень запуска по умолчанию

                
id:5:initdefault:

Описание уровней запуска

Существует семь уровней запуска – от 0 до 6. Уровень 0 – это режим остановки системы ("System halt"); перейти в этот режим можно, послав системе команду завершения работы. Уровень 1 – однопользовательский ("Single user mode") режим, который используется в основном для диагностики и устранения неполадок в системе. Уровень 2 – многопользовательский ("multiuser") режим, уровень 3 – многопользовательский режим с поддержкой сети (обычно под этим подразумевается NFS). Уровень 4 не используется, уровень 5 – это XDM (графический менеджер дисплея X) и уровень 6 – перезагрузка системы ("System reboot").

Согласно информации, содержащейся в файле /etc/inittab, вы вряд ли захотите сделать уровнем запуска по умолчанию уровень 0 или 6. После этого может оказаться очень сложно восстановить систему, хотя дружественный загрузчик ОС или компакт-диск восстановления системы, конечно, позволит вам исправить ситуацию. Практически во всех современных настольных системах Linux уровнем запуска по умолчанию является runlevel 5. Некоторые системы используют другие уровни запуска, но в Fedora 7 используется именно этот.

Формат строки сформировался исторически, и все, что на самом деле нужно знать для успешного изменения уровня запуска – это то, что вы можете изменить цифру 5 на цифру 2 или 3. После этого при следующей загрузке системы вместо среды X вы увидите строку приглашения в текстовой консоли.

Неоспоримый факт заключается в том, что текстовая консоль является гораздо лучшим выбором для работы в системе с ограниченным объемом памяти, нежели полновесная среда X. А сейчас наступил подходящий момент для того, чтобы разобраться и посмотреть, от чего же мы можем избавиться. Измените значение параметра initdefault в файле /etc/inittab на 3 и перезагрузите систему (для смены уровня вы можете использовать команду init, но бывают случаи, в которых она не работает). Вы сразу же заметите, насколько быстрее будет загружаться система. Сразу же после входа в систему снова запустите команду top. Результаты могут варьироваться, но вы увидите, что память используется примерно наполовину, а не почти полностью, как это было раньше. Это уже достижение!

Освобождаем еще немного памяти

Заполучить сотню мегабайт свободной памяти — это очень хорошо, тем не менее, можно освободить еще немного. Повторный запуск top говорит нам о том, что остались еще приложения, занимающие память.

Листинг 4. Извините, я этого не заказывал

                
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2204 root 39 19 30056 12m 5632 S 0 5.7 0:00.70 yum-updatesd
1825 root 20 0 19220 5052 972 S 0 2.3 0:00.00 python
2238 haldaemo 20 0 6648 2728 2180 S 0 1.2 0:00.27 hald
1909 root 20 0 13480 2236 1564 S 0 1.0 0:00.02 cupsd
2015 root 20 0 12352 1976 1272 S 0 0.9 0:00.02 console-kit-dae
1958 root 20 0 12132 1796 748 S 0 0.8 0:00.01 sendmail
2301 root 20 0 5548 1792 1484 S 0 0.8 0:00.02 login
2141 xfs 20 0 5388 1776 884 S 0 0.8 0:00.05 xfs
2425 seebs 20 0 5392 1732 1480 S 0 0.8 0:00.08 bash
2371 seebs 20 0 5392 1728 1480 S 0 0.8 0:00.08 bash
1966 smmsp 20 0 10356 1576 696 S 0 0.7 0:00.00 sendmail
2221 avahi 20 0 3772 1520 1344 S 0 0.7 0:00.07 avahi-daemon
1751 root 20 0 11332 1348 588 S 0 0.6 0:00.43 pcscd
1796 root 20 0 29652 1304 1032 S 0 0.6 0:00.02 automount

Безоговорочно, самым ресурсоемким процессом является yum-updatesd, по-видимому, представляющий собой службу программы обновления yum. К счастью, мы с легкостью можем обойтись без этой службы – при необходимости можно в любой момент запустить yum вручную.

Редактирование уровней запуска

К сожалению, не существует таких специальных уровней запуска, как например "уровень runlevel 3 без службы yum-updatesd". Это означает, что настало время приступить к самостоятельному отключению служб. Есть несколько способов сделать это. Каждый уровень запуска представлен соответствующей подпапкой в папке /etc/rc.d, называющейся rcN.d (где N – номер уровня). Например, уровень runlevel 3 определяется файлами, расположенными в папке /etc/rc.d/rc3.d (в Fedora 7 для этих папок существуют символьные ссылки, расположенные в папке /etc, но лучше приучиться использовать полные пути).

В каждой из этих папок находятся файлы с довольно загадочными именами, такими как "K74nscd" или "S88nasd". На самом деле правила именования этих файлов простые: имена, начинающиеся с буквы K, являются службами, которые будут остановлены при переходе на данный уровень запуска (предположительно переход осуществляется с более высокого уровня, на котором эти службы могли использоваться), а имена, начинающиеся с буквы S – это службы, которые будут запущены при переходе на данный уровень. Двузначное число используется для указания очередности запуска служб: так, служба S13rpcbind запускается раньше, чем служба S14nfslock, которая, в свою очередь, запускается раньше, чем служба S25netfs. Просто и эффективно.

Как правило, эти имена не являются именами файлов, а представляют собой символьные ссылки к скриптам, хранящимся в папке etc/rc.d/init.d. Обычно для каждой службы пишется простой скрипт, запускающий либо останавливающий ее, а затем для этого скрипта создаются соответствующие ссылки. Когда команда init изменяет уровень запуска, происходит вызов тех или иных скриптов с указанным аргументом "start" или "stop".

Если вы чувствуете себя готовым к бою, вы можете просто удалить ненужные ссылки (как K*, так и S*) из папки соответствующего уровня. Точно также, вы можете добавить свои собственные ссылки. Другим способом редактирования уровней запуска является использование утилиты chkconfig — очень гибкой и мощной утилиты для управления символьными ссылками. Предупреждение: если случится так, что вы удалите какую-то критически важную службу, вам может понадобиться компакт-диск для восстановления системы, например, установочный диск Fedora (обратитесь к разделу Ресурсы), с помощью которого вы сможете выполнить чистую загрузку. Поэтому, прежде чем удалять какую-либо службу, вы должны понимать, для чего она предназначена, и какие другие процессы от нее зависят.

В качестве примера рассмотрим удаление службы yum-updatesd уровня runlevel 2. Для этого вы можете просто удалить ссылку /etc/rc.d/rc2.d/S97yum-updatesd. Если вы хотите отключить эту службу с помощью утилиты chkconfig, вам нужно выполнить следующую команду: /sbin/chkconfig yum-updatesd off.

Поиск дополнительного количества свободной памяти

При помощи команд chkconfig и top можно обнаружить достаточное количество процессов, существенно потребляющих память, узнать, для чего они предназначены, и при необходимости удалить их. Но что насчет процесса Python? Службы Python не существует. Команда ps показывает нам следующее:

Листинг 5. Информация о Python

                

$ ps ax | grep python
1825 ? S 0:00 python ./hpssd.py

При помощи удобного инструмента grep можно обнаружить, что Python является частью службы hplip – "HP Linux Imaging and Printing". Если у вас есть определенные модели принтеров или сканеров производства HP, вы можете использовать эту службу, в противном случае она не нужна. Поэтому, отключите ее, если вы еще не сделали этого.

В итоге на самой обычной системе, которую мы собираемся использовать для разработки приложений, объем используемой памяти составил 49 896 КБ против первоначальных 213 692 КБ. Таким образом, объем свободной памяти увеличился с 5 500 КБ до 169 296 КБ, что существенно добавляет пространства для работы компилятора. Получаемый от этого выигрыш будет зависеть от рабочей нагрузки вашей системы. Многие фоновые процессы могут быть выгружены системой в swap-файл на жестком диске и в дальнейшем оставаться в этом состоянии все оставшееся время, не занимая память. Благодаря этому, данные процессы никаким образом не будут оказывать влияние на быстродействие вашей системы, а при долгой работе даже самый небольшой прирост в скорости работы компилятора имеет значение.

Далее: настройка среды X для приемлемой работы

Как вы видите, пожертвовав некоторым ненужным или неиспользуемым функционалом, вы можете освободить для своих нужд огромный объем системной памяти, достаточный для написания и компиляции исходного кода. Тем не менее, многие пользователи сочтут полный отказ от графической среды X слишком высокой платой за эту возможность. В третьей части этой серии мы выясним, как настроить работоспособную среду X, в которой было бы можно выполнять простую работу с графикой, не потеряв при этом возможности запускать компилятор.

 

Оставьте комментарий