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

На просторах интернета есть много статей на тему как это реализовать — отказ от LAMP в пользу nginx+php-fpm или uWSGI (по надобности), тонкой их настройки (не забываем кэшировать статику), установки PHP акселератора, тюнинга СУБД (если используется), и другие полезные вещи.

Но даже при установке и грамотного выполнения всех пунктов можно еще немного оптимизировать работу сервисов.

Речь пойдет о задании приоритетов для процессов (man nice, man renice).

Ядро linux поддерживает градацию приоритетности процессов от -20 до +19 (отрицательное значение — высокий приоритет, положительное значение — низкий приоритет, 0 приоритет — дефолтное значение для пользовательских процессов).
SPRI — позволяет присваивать приоритет запуска сервисов, в зависимости от Ваших нужд, для улучшение работоспособности сервера.
При грамотной настройке возможно уменьшение LA сервера на 5-20%.

Установка


Скачиваем последний релиз тут.

# wget http://www.r-fx.ca/downloads/spri-current.tar.gz


Распаковываем архив
# tar -xvzf spri-current.tar.gz


Запускаем скрипт установки install.sh

# /bin/bash spri-0.5/install.sh


Скрипт будет установлен в директорию /usr/local/spri и будет создан симлинк на него /usr/local/sbin/spri, в cron будет добавлена запись не его выполнение каждые 45 минут(меняется по своему усмотрению и нуждам).

# less /etc/cron.d/spri 
*/45 * * * * root /usr/local/sbin/spri -q >> /dev/null 2>&1

Настройка


По умолчанию SPRI делит процессы на шесть категорий: low, low-med, med, med-high, high, rt (думаю разница в «важности» интуитивно понятна из названия).


Структура директории скрипта (/usr/local/spri)
  • spri — сам скрипт, который вызывается каждые 45 минут (смотрим в cron) и меняет приоритеты для демонов согласно своему настроению.
  • conf.spri — конфиг-файл в котором определяются приоритеты для групп и задан путь по которому берется информация о списках сервисов входящих в ту или иную группу.
  • ps.ignore — процессы, которые игнорируются.
  • директория prios — в ней хранятся файлы приоритетов групп (high, low, low-med, med, med-high, rt) с записанными в них сервисами.

Добавление, удаление сервиса из группы проводится путем редактирования нужного файла, к примеру /usr/local/spri/high.
Для просмотра приоритета можно воспользоваться утилитой top, значение в столбце NI

Запуск


Для применения изменений, внесенных в конфиг файлы групп, нужно запустить скрипт.
Он поддерживает два формата запуска — бесшумный и разговорчивый.

# spri 
SPRI 0.5 [spri@r-fx.org]
========================
-v      Show Output
-q      Hide Output



В cron прописан quite запуск, запуск с ключом -v удобен для составления общей картины текущих настроек (не слишком то удобно поочередно лазить по всем шести конфиг-файлам).

Так как сам скрипт применяется каждые 45 минут (если параметр не изменялся руками), нужно добавить его в автозапуск для старта после плановых и не очень ребутов.

Открываем файл rc.local
nano /etc/rc.local

и добавляем строку
/bin/bash /usr/local/sbin/spri -q

!добавить до строки exit 0, сохраняемся и выходим из текстового редактора.
!можно прописать и без полных путей — spri -q

В зависимости от своих задач расставляем приоритеты на сервисы, и анализируем результат (для нахождения «идеального» результата вероятней всего потребуется несколько попыток).
При правильной расстановке приоритетов получится еще немного улучшить результативность своего проекта.

*сайт проекта https://www.rfxn.com/projects/system-priority/

Комментарии (8)


  1. librarian
    29.12.2015 23:16

    cgroup?


  1. bockra
    30.12.2015 00:27
    +6

    image
    Ребят, ну не заставляйте в каждый ваш пост приходить с этой картинкой :)


    1. HostingManager
      30.12.2015 00:55
      +3

      А Вы не приходите просто. Лично я прикола картинки не оценил и воспринимаю это как спам и неуважение к автору. Может потому, что не админ (про картинку). Пост создан для людей, как полезный лайфхак. Если Вам все известно, то это во все не означает, что это известно всем остальным и все мегаопытные и крутые админы.


      1. bockra
        30.12.2015 01:23
        +7

        нет-нет. Ни в коем случае не считаю себя/всех мегаопытными и крутыми админами.

        Данная картинка означает следующее:
        изображение минивена с надписью Free Candy показывает что конфеты скорее всего не дадут если залезть в этот фургон и более того должно произойти что-то совсем нехорошее.
        Так же выполнение скриптов скачанных с какого-либо ресурса перед выполнением совершенно не гарантирует выполнение изложенных в статье ссылок на скрипты. (тут еще указана команда sudo, позволяющая сделать буквально что угодно на машинке )

        Второй раз в этом корп блоге выкладываются инструкции о пошаговой настройке с указанием скачать скрипт с какого-то сервера ( в данной статье какого-то сервера находящегося в Альбукерке, в предыдущей владелец некий Ravi Saive из Бомбея, который хостит свой сервер на виртуалке в Linode)
        Кто знает, может владелец сервера увидев данную статью (а это не сложно учитывая довольно быструю скорость индексации поисковиками данного ресурса) захочет сделать например следующее:
        взять кусок кода

        #!/bin/sh
        INSPATH="/usr/local/spri"
        BINPATH="/usr/local/sbin/spri"
        
        if [ -d "$INSPATH" ]; then
                rm -rf $INSPATH
                mkdir $INSPATH
                cp -R files/* $INSPATH
                chmod 640 $INSPATH/*
                chmod 750 $INSPATH/spri
                ln -fs $INSPATH/spri $BINPATH
        


        и заменит на
        #!/bin/sh
        INSPATH=~/
        BINPATH="/usr/local/sbin/spri"
        
        if [ -d "$INSPATH" ]; then
                rm -rf $INSPATH
                mkdir $INSPATH
                cp -R files/* $INSPATH
                chmod 640 $INSPATH/*
                chmod 750 $INSPATH/spri
                ln -fs $INSPATH/spri $BINPATH
        


        тут даже sudo не надо чтобы очистить ваш homedir.
        А вот в предыдущей статье habrahabr.ru/company/ua-hosting/blog/273723 вполне можно хоть руткит поставить данным скриптом, тк внутри есть su -c "...."

        Надо не забывать читать такие скрипты перед запуском, особенно если они распространяются с ресурсов, не принадлежащих (если только ua-hosting не перепродает виртуалки на linode или не является дочкой R-fx Networks) авторам блога.
        Так что в случае изменения начального скрипта вам потом некуда будет отправлять свои жалобы «аааа, мне затерли домашнюю директорию!!»


        1. ximaera
          30.12.2015 02:06
          +5

          И ещё вот это:

          nostromo:~ ximaera$ whois r-fx.ca
          Domain name:           r-fx.ca
          Domain status:         registered
          Creation date:         2005/02/24
          Expiry date:           2016/02/24

          Если через 2 месяца домен протухнет и его перехватят какие-нибудь хитрые люди, будет очень весело.

          Впрочем, вот эта последовательность представляет собой RCE via MITM даже при полной добросовестности r-fx.ca:

          # wget http://www.r-fx.ca/downloads/spri-current.tar.gz
          # tar -xvzf spri-current.tar.gz
          # /bin/bash spri-0.5/install.sh


        1. HostingManager
          30.12.2015 03:31
          +4

          Благодарю за это ценное замечание, я передам нашему администратору, чтоб впредь учитывал такую вероятность. Вы абсолютно правы. Извините, что не понял Вас сразу. Просто для написания того или иного материала используются какие-то источники, ну и на них дается ссылка, в общем-то.


    1. librarian
      30.12.2015 02:46
      +1

      Привет тебе от атома :)


  1. Eklykti
    30.12.2015 10:05
    +2

    Сейчас же практически везде systemd, а в нём управление приоритетами и много чем ещё искаропки, а всякие левые скрипты с непонятных доменов не нужны и опасны.