Сайт Романа ПарпалакаБлогКлючевые словалинукс

линукс

Статьи по этой теме:
Латех и веб-технологии
Windows vs. Ubuntu


CPU steal time на виртуальном сервере, мониторинг и перцентили

17 февраля 2025 года, 00:41

Оказывается, на виртуальных серверах есть специальная метрика CPU steal time. Она показывает, сколько процессорного времени было «украдено» у вашего сервера другими виртуальными машинами на том же физическом сервере. Есть смысл проверить эту метрику, если вы сталкиваетесь с необъяснимыми подтормаживаниями. Их причина может быть не в вашей системе, а в соседях по серверу.

Я периодически сталкиваюсь с этой проблемой на моем хостинге. Она проявляется в том, что изредка база данных обрабатывает запросы в десятки раз медленнее, чем обычно. Отследить такую ситуацию без специальных инструментов почти невозможно, потому что просто ходя по сайту, вы либо не заметите, что на двадцатый раз страница открывалась дольше, либо не поймете причину. Я использую New relic, о чем уже писал.

Изучая статистику после долгого перерыва, опять заметил, что проблема вернулась. Рассмотрел график из нью-релика с использованным и «украденным» процессорным временем. На нем видно, что 9 декабря появился заметный CPU steal time. Кто-то из соседей по физическому серверу стал активно нагружать процессор.

Казалось бы, величина не сильно большая: steal time не превосходит полпроцента, в то время как собственное потребление виртуалки около 5%. Но надо помнить, что это средние значения. Мгновенные значения в отдельные моменты времени могут оказаться гораздо больше. Чтобы их оценить, нужно смотреть на графики перцентилей.

На втором графике я вывел 95-ю и 99-ю перцентили времени ответа сервера при генерации страниц блога. Перцентили вычисляются из детальной статистики, а ее нью-релик хранит только последние 8 дней, так что сейчас уже никак не узнаешь, что происходило в районе 9 декабря. Когда я обнаружил проблему, среднее и медианное время генерации были около 30 миллисекунд, а 99-я перцентиль — около 190 миллисекунд (это значит, что каждый сотый запрос выполнялся сервером дольше, чем 190 миллисекунд).

Что же делать с этой проблемой? Хостеру я писать не стал, скорее всего это бесполезно. Тариф предусматривает общий ресурс процессора, так что наверняка это штатное использование. В таких случаях я делаю временный «ресайз» виртуалки: перехожу на следующий тарифный план с дополнительным количеством памяти и дискового пространства, а потом возвращаюсь назад. С определенной долей вероятности на текущем гипервизоре не будет доступных ресурсов, и система переместит виртуалку на другой гипервизор. Если повезет, то и оборудование будет новее. При возврате к старому тарифному плану виртуалка скорее всего не будет никуда перемещаться.

Я сделал временный ресайз и виртуалка оказалась на другом гипервизоре. Этот момент я отметил на графике красной лииней. CPU steal time упал практически до нуля, перцентили приблизились к среднему и медиане. Среднее время генерации тоже снизилось с 30 до 10 миллисекунд, потому что на гипервизоре оказался более мощный процессор.

Влияние ресайза я обнаружил случайно в сентябре 2023 года, когда хотел проверить, поможет ли увеличение памяти победить непонятные подтормаживания. Эффект был, но не от увеличения объема оперативки, а от перемещения виртуалки на новый гипервизор. Это подтверждает упавший график steal time:

Однако проблема повторилась в декабре 2023 года в большем масштабе, когда steal time подскочил до 8% и дальше стал колебаться около 2%:

Пришлось опять делать ресайз. Мешающие соседи ушли, однако виртуалка оказалась на гипервизоре с более старым и слабым процессором. Получилось не так удачно, но я не стал дальше испытывать судьбу.

Я стараюсь не злоупотреблять временным ресайзом для переноса виртуалки на более новое железо. Мне кажется, этот прием из серой зоны. С одной стороны, я систему специально не взламываю, пароли не подбираю, уязвимости не ищу и не эксплуатирую, нажимаю только на доступные в интерфейсе кнопки. С другой стороны, цель моих действий — не увеличить ресурсы сервера, а избавиться от мешающих соседей. И хостер, если захочет, может ослеживать и наказывать таких умников.

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

Снова на линуксе

24 февраля 2023 года, 01:05

Основной операционной системой у меня всё время была Windows. Я пробовал пересесть на Ubuntu в 2010 году, но больше недели продержаться не смог.

Два с половиной года назад я установил на новый рабочий ноутбук Ubuntu. Не то чтобы я испытывал какие-то проблемы с Windows. Просто у компьютеров в домене были какие-то ограничения, и я решил попробовать Ubuntu. С тех пор использую ее как основную систему для работы.

(Надо сказать, что я попросил на работе ноутбук ThinkPad X1 Yoga с экраном 4K. И экран у него оказался OLED с регулировкой яркости через ШИМ, то есть на пониженной яркости он мерцал на частоте около 200 герц. В интернете были какие-то инструкции для повышения частоты ШИМ. И я надеялся, что они заработают в линуксе. Но из этого ничего не получилось.)

Главный вывод

Современные операционки можно настроить так, чтобы привычки, формируемые интерфейсом, работали одинаково и в Ubuntu, и в Windows. Например, в Windows я часто пользовался клавиатурным сокращением Win+R для запуска команд типа c:, mspaint, regedit, cmd, calc:

И раньше в Ubuntu я навешивал на Win+R вызов консоли. А сейчас ту же задачу можно выполнить, просто нажав на клавишу Win и начав вводить название программы. Благодаря автодополнению можно ввести только часть названия и нажать Enter, что было невозможно в предыдущем окне.

Полностью аналогично работает поиск по меню в Ubuntu, ничего настраивать не надо.

Наблюдения при работе

Веб-приложения на PHP работают быстрее, чем в Windows под WSL. Это особенно важно при запуске тестов в крупных проектах: всё-таки работать проще, когда тесты выполняются за 10 минут, а не за полчаса. Причина ускорения скорее всего в файловой системе. Нативная файловая система работает быстрее.

Для рисования стилусом по экрану я установил программу Stylus Labs (есть версии для всех операционных систем). Очень удобно рисовать схемы, пока объясняешь что-нибудь во время видеозвонка. Получается почти как на листе бумаги, когда сидишь с собеседником за одним столом.

PhpStorm работает так же хорошо, как и в Windows. Единственная проблема появляется при подключении внешнего монитора. В момент подключения меняется размер рабочего стола, и почему-то PhpStorm начинает дико тормозить. Оба экрана остаются черными. Если закрыть PhpStorm, подключить второй монитор и запустить PhpStorm заново, такой проблемы нет.

Почтовый клиент Thunderbird в целом неплох. Правда, страдает интеграция с системой и приложениями. Скажем, если дважды кликнуть на прикрепленный экселевский файл, то LibreOffice запустится. Но после загрузки он выдаст ошибку об отсутствующем файле. Каждый раз, когда тебе присылают офисный файл, приходится сохранять куда-нибудь, и только потом открывать. В Windows таких проблем нет. Там, например, даже работает перетаскивание прикрепленных файлов из Outlook сразу в форму в браузере.

LibreOffice в принципе работает, но не так удобно, как микрософтовский офис. Однажды мне пришлось готовить документ по примеру некоторого вордовского документа. Я закончил и отправил коллегам. У них документ не открылся. У меня он тоже перестал открываться. К счастью, формат docx — это zip-архив с несколькими xml-файлами. Я распаковал его, нашел и исправил ошибку в форматировании xml-файла и собрал docx заново. Правда, надо признаться, что я взял за основу документ в режиме рецензирования, и в нем была сохранена куча предыдущих версий. Но это не оправдывает LibreOffice за то, что он сформировал на выходе невалидный файл.

Особая трудность

Одна из трудностей была связана с приложениями на электроне типа Слака и Скайпа, и переключением языка. Я переключаю язык комбинацией клавиш Alt + Shift. В Ubuntu её, разумеется, тоже можно задействовать, и почти во всех программах она работает без проблем. А в этих приложениях почти всегда при переключении языка активируется меню, которое обычно скрыто. И ладно, если бы оно просто появлялось. Оно еще и фокус забирает себе и не дает вводить текст дальше.

Эксперимент показывает, что если при переключении языка нажать Alt, нажать Shift, отпустить Shift, отпустить Alt, то язык переключается корректно и меню не вызывается. А у меня при быстром наборе последовательность отпусканий клавиш другая: я сначала отпускаю Alt, а потом отпускаю Shift, рука будто «перекатывается» между альтом и шифтом. Я пробовал изменять параметры как приложений, так и самой операционной системы. На хабре даже есть отдельная статья по решению этой проблемы. У меня ничего не получилось, и я просто стал запускать Слак в браузере. Работает он не хуже, чем в отдельном приложении.

Сюрпризы при обновлении

Каждая новая версия Ubuntu преподносит сюрпризы. Иногда приятные, когда что-то починилось. Иногда не очень, когда ломается что-то новое. Например, в версии 22.04, которая как LTS должна быть особо стабильной, что-то изменилось в обработке сигналов с датчика ориентации. Если просто закрыть крышку ноутбука (он уйдет в спящий режим) и открыть ее, изображение перевернется на 180°. И назад не возвращается, если автоповорот не включен. Приходится держать автоповорот включенным и терпеть его ложные срабатывания.

Еще пример. Недавно разработчики Ubuntu решили перейти с X11 на Wayland. В этом Wayland у меня не работала демонстрация экрана в Zoom. К счастью, они оставили возможность использовать и X11, только непонятно, надолго ли.

Резюме

В Ubuntu относительно удобно выполнять задачи разработчика, а задачи аналитика и менеджера выполнять или трудно, или совсем невозможно.

    1 комментарий

Отладка запросов к FastCGI из консоли

13 января 2023 года, 15:25

Обычно протокол FastCGI применяется для общения между веб-сервером и бэкендом. Например, связка nginx и PHP-FPM работает по этому протоколу. Для таких случаев есть типовые конфигурации, всё начинает работать из коробки, и особая отладка не требуется.

Однако как быть, если у вас есть собственный сервис, работающий по протоколу FastCGI (скажем, простая асинхронная очередь через PHP-FPM), и вам нужно его отладить? Как понять, где ошибка, если что-то не работает?

Можно было бы настроить в nginx отдельный location, подключить к нему отлаживаемый сервис и отправлять http-запросы через веб-сервер. Однако есть способ проще, который не требует изменения конфигурации сервисов.

Предположим, у вас есть скрипт, который забирает входные данные из $_POST['formula'] и $_POST['extension']. Тогда вызвать этот скрипт с данными formula=12345 и extension=svg можно вот так:

user@tau:~$ echo "formula=12345&extension=svg" | sudo -uwww-data \
> CONTENT_TYPE='application/x-www-form-urlencoded' CONTENT_LENGTH=28 \
> SCRIPT_FILENAME=/var/www/.../.../cache_processor.php \
> REQUEST_METHOD=POST cgi-fcgi -bind -connect /var/run/php_fpm.sock

В консоли мы увидим ответ, например, такой:

PHP message: PHP Warning: file_get_contents(...): failed to open stream: No such file or directory in ... on line 88Content-type: text/html; charset=UTF-8

В этом методе используется утилита cgi-fcgi, которая проксирует запрос из консоли к FastCGI.

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

Прокси-сервер через ssh

27 февраля 2022 года, 20:50

Полезная вещь в современных условиях — прокси-сервер через ssh. Если у вас есть доступ к какому-нибудь серверу по ssh, и вы хотите пропускать через него свой трафик, запустите в консоли команду

ssh -D 1337 -q -C -N example.com

Разумеется, вместо example.com нужно подставить ваш хост. После запуска вы можете использовать localhost и порт 1337 как параметры SOCKS5 прокси-сервера в браузере и других программах. При этом данные будут идти через соединение по ssh с вашим сервером.

Если у вас windows, можете взять консоль WSL, установить MinGW или поискать аналогичную функциональность в PuTTY на вкладке Connection/SSH/Tunnels.

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

Переносим сессии при переезде между серверами

12 июля 2020 года, 23:29

Как-то нам нужно было перенести сессии PHP с одного сервера на другой. Сессии хранились в файлах. Серверы друг друга не видели. Но с рабочего компьютера оба были доступны. Решение — команда scp -3:

ssh 10.0.0.1 'sudo chmod go+r /var/www/project/var/sessions/prod/*'
ssh 10.0.0.2 'sudo chmod go+w /var/www/project/var/sessions/prod'
scp -3 user@10.0.0.1:/var/www/project/var/sessions/prod/* user@10.0.0.2:/var/www/project/var/sessions/prod
ssh 10.0.0.1 'sudo chmod go-r /var/www/project/var/sessions/prod/*'
ssh 10.0.0.2 'sudo chmod go-w /var/www/project/var/sessions/prod'
ssh 10.0.0.2 'sudo chown www-data:www-data /var/www/project/var/sessions/prod/*'
ssh 10.0.0.2 'sudo chmod go-r /var/www/project/var/sessions/prod/*'

После этого серверам переназначили ip-адреса. В итоге получился бесшовный переезд.

    2 комментария

WSL: Линуксовая подсистема в Windows

8 января 2018 года, 01:23

Полноценная веб-разработка на Windows всегда была нелегкой. Для небольших сайтов хватало сборок апача с PHP вроде Денвера. Но как только в проекте требуется memcached, redis или что-то более сложное, настройка окружения существенно усложняется или вообще становится невозможной.

В этот момент разработчики начинают использовать виртуальные машины, локальные или удаленные. Вместе с ними появляются проблемы синхронизации файлов в крупных проектах. Для продуктивной работы PhpStorm индексирует файлы проекта и наблюдает за их изменениями. Когда файлы редактируются на одной операционной системе, а исполняются и управляются из гита на другой, неизбежны задержки синхронизации или тормоза индексирования. Еще и composer где-то нужно запускать, что добавляет путаницы с синхронизацией.

Неискушенный читатель может спросить, зачем вообще разрабатывать на Windows. Причины могут быть разные. Например, корпоративная политика. Админам проще управлять кучей компьютеров с Windows.

Так или иначе, проблема удобной настройки окружения для веб-разработки на PHP была решена только в Windows 10. В ней появилась линуксовая подсистема, или WSL. Она позволяет запускать скомпилированные для линукса бинарники. При этом ядро линукса отсутствует, а системные вызовы к нему на лету транслируются в Win API. В общем, WSL — это Wine наоборот.

Несколько лет после выхода линуксовая подсистема была в состоянии беты, и пользоваться ей было невозможно. Но, начиная с Creators Update, выпущенного в апреле, ситуация изменилась, и nginx вместе с php-fpm нормально заводится и работает.

С практической точки зрения WSL — это командная строка bash, в которой можно устанавливать любой пакет из репозитория Ubuntu 16.04 через apt install. Диски компьютера примонтированы и доступны в файловой системе через /mnt/c, /mnt/d и т. д.

Ребята из Микрософта нацеливались на «интероперабельность»: из bash можно запустить не только линуксовые elf-бинарники, но и обычные exe-файлы. Процессы могут без проблем работать друг с другом. Например, мне было лень делать дамп и переносить базу данных, и я оставил ее в Windows. К ней успешно подключается php-fpm.

Я перевел ежедневную работу на линуксовую подсистему. Обнаружил две проблемы. Первая: не работают unix-сокеты. Решается использованием TCP-сокетов в конфигурации php-fpm и nginx. Вторая: nginx падает при загрузке файлов, из-за того что вызывает нереализованную функцию. Решается запуском встроенного в PHP веб-сервера при тестировании загрузки файлов. Ситуация у меня возникала редко. Может быть ее уже исправили, а я об этом и не знаю.

Еще есть особенность: не работают средства автозапуска программ. Пришлось добавить команды service start nginx в .bashrc.

И еще есть баг. Через некоторое время процесс beam начинает загружать процессор. Приходится останавливать сервис rabbitmq.

Положительные моменты: можно выкинуть MinGW, виртуальные машины и прочие попытки завести bash на Windows, и работать в полноценной линуксовой консоли. Софт в среде разработки идентичен софту на боевом сервере и обновляется одной командой apt upgrade.

Спустя три года я всё-таки перешел на Windows 10, линуксовая подсистема стала в этом решающим фактором.

    4 комментария

HTTPS и Letsencrypt

1 марта 2016 года, 19:42

Протокол https отличается от http передачей данных в зашифрованном виде. Обычно шифрование необходимо, когда на сайте встречаются закрытые паролем страницы. Однако есть и другие причины. Мне пришлось поддерживать https на сервисе генерации картинок с формулами на латехе, чтобы их можно было встраивать в другие https-страницы. Новый протокол HTTP/2 будет работать в браузерах только через https. А еще Гугл учитывает наличие шифрования при ранжировании.

Для нормальной работы сайта по https требуется сертификат. Центры сертификации выдают их за определенную плату после подтверждения владения доменом.

Вообще-то, добыть бесплатный сертификат можно было и раньше на сайте StartSSL, но без особого удобства. После регистрации и проверки электронной почты вы получаете сертификат для входа на сайт StartSSL. Добавляете его в браузер. Подтверждаете владение доменом через почту webmaster@example.com. Бесплатные сертификаты выдают на один домен и один поддомен сроком на год. Вы загружаете их на сервер и указываете в конфигурации веб-сервера. Для nginx нужно объединять ваш сертификат и промежуточный сертификат в один файл.

С появлением сервиса Letsencrypt процедура получения сертификатов существенно упростилась. Вы устанавливаете на своем сервере клиентское программное обеспечение для общения с сервером Letsencrypt. Чтобы подтвердить владение доменом, организуете папку, содержимое которой доступно в вебе:

location ^~ /.well-known/acme-challenge {
    alias /var/www/letsencrypt;
}

Папка почти всегда будет пустовать. На время работы клиент Letsencrypt создает в ней файлы, а сервер их читает и убеждается, что доменом владеете действительно вы. После проверки сгенерированные сертификаты записываются в специальную папку. Вам остается подключить их к веб-серверу.

Срок действия сертификатов — 90 дней. Но это не проблема, потому что легко настроить повторную выдачу сертификатов автоматически, по крону, например, раз в два месяца.

Насколько я понял, wildcard-сертификаты (*.example.com) не поддерживаются (уже поддерживаются). Но вы можете сформировать один сертификат на несколько поддоменов. Либо создавать сертификат на каждый новый поддомен.

Официальный клиент Letsencrypt у меня на Дебиане не заработал. При запуске он скачал и установил какие-то дебиановские пакеты. Вместо генерации сертификата выводил непонятную питоновскую ошибку, с которой я ничего сделать не смог. Поиск привел к альтернативному клиенту dehydrated на старом добром баше. Он сразу заработал без проблем. Рекомендую использовать его.

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

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

Debian 8

1 мая 2015 года, 11:49

Обновил Debian на виртуальном сервере до недавно вышедшей 8 версии (jessie). В целом обновление прошло гладко. С конфигурацией Nginx были проблемы. Во-первых, в ходе установки в sites-enabled включился хост «default», из-за чего оказалось два сервера по умолчанию. Во-вторых, из-за путаницы с fastcgi_params и fastcgi.conf перестал работать PHP. Отдавалась пустая страница и ответ 200, в логах пусто. Не сразу разобрался, в чем дело, потому что искал причину в конфигурации php-fpm.

Еще из-за перехода с SysV на systemd перестал запускаться svnserve. Пришлось опять вручную настраивать запуск. Для этого надо сделать файл /etc/systemd/system/svnserve.service с примерно таким содержимым:

[Unit]
Description=SVN Server

[Service]
Type=forking
User=svn
Group=nogroup
ExecStart=/usr/bin/svnserve --daemon -r /var/svn --log-file /var/log/subversion.log

[Install]
WantedBy=multi-user.target

Затем выполнить команды systemctl start svnserve и systemctl enable svnserve.

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

Простое резервное копирование

3 августа 2011 года, 20:12

Давайте я вам расскажу, как работает резервное копирование (бекап) на моем сервере. Самая ценная информация хранится в базе данных. Помимо этого есть еще код движка в репозитории subversion, который бы не хотелось потерять. Их и будем архивировать.

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

Сначала напишем небольшой скрипт, архивирующий данные и отправляющий их на почту. Вот что у меня получилось:

#!/bin/bash
DATE="`date +%Y-%m-%d_%H-%M-%S`"
SVN="s2-backup_$DATE.svn.7z"
MYSQL="mysql-backup_$DATE.sql.7z"

svnadmin dump /path/to/project -q | 7za a -si -p123asd $SVN
mysqldump -ubackup -p123asd --all-databases | 7za a -si -p123asd $MYSQL

echo Backups for $DATE | biabam $SVN,$MYSQL -s "Backups $DATE" mail@example.com

[ -n "$1" ] && [ "$1" = delete ] && ( rm $SVN ; rm $MYSQL )

Сразу замечу, что «123asd» нужно заменить в каждом месте на правильный пароль.

В первых трех строчках мы составляем из текущей даты имена файлов с архивами.

В следующих двух строчках архивируем репозиторий и дамп базы данных. Тут нужно вписать правильный путь до репозитория subversion, а также имя и пароль существующего пользователя базы данных. Используемые здесь архивы 7z компактнее zip, gz и др. На архивы нужно поставить пароль подлиннее, чтобы избавиться от симптомов паранойи по поводу хранения конфиденциальной информации на серверах Гугла.

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

Последнюю строчку я добавил для управления судьбой созданных архивов после отправки письма. Чтобы их удалить, скрипт нужно вызывать с параметром delete. Этот параметр используется при автоматическом запуске скрипта с помощью cron (параметры ниже соответствуют ночному запуску два раза в неделю):

15  3   *   *   0,3  ~/backup/backup.sh delete > /dev/null

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

Вы можете взять этот пример за основу и добавить архивирование другой ценной информации.

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

Проблемы открытого кода

3 октября 2009 года, 13:08

Статья «Проблемы открытого кода». Со многими вещами я согласен, но не со всеми.

Меня очень огорчает, когда я вижу всю эту молодёжь, которая думает, что Linux это круто, в то время как устройство этой системы настолько древнее, что будь она человеком, из неё давно бы песок сыпался. Им бы лучше придумывать что-то новое. Представьте себе молодого выпускника колледжа, специалиста по аэродинамике, который тратит жизнь обслуживая DC 10! (древняя модель самолетов, год выпуска — 1970). Ни один человек в мире, способный на инновации, не стал бы этим заниматься.

Почему, объясните мне, если что-то работает, причем работает хорошо, это надо обязательно выбросить под предлогом древности?

Линукс хороший, лучше него никто не может обрабатывать текстовую информацию. В том числе из-за этого он заслуженно занимает нишу серверных операционных систем.

    Оставить комментарий
Поделиться
Записи