Почему на сервере Hetzner медленно работает диск

Заметил внезапное снижение производительности на одном из CentOS 7 серверов и не менее внезапное появление ошибок 502 Bad Gateway, которых даже во время хорошей нагрузки ни разу не было, а тут ночью во время простоя вдруг начали валить. Первым делом стал смотреть вывод iostat -x 3:

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 58.00 8.33 1614.33 0.33 107477.33 34.67 133.17 4.32 2.63 2.63 33.00 0.35 56.80
sda 79.33 8.33 1600.00 0.00 108074.67 0.00 135.09 29.38 18.14 18.14 0.00 0.62 100.00
md2 0.00 0.00 0.00 8.67 0.00 34.67 8.00 0.00 0.00 0.00 0.00 0.00 0.00
md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
md1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
md3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Кто-то со страшной силой читает данные с диска со скоростью 100+ Мб/с, как видно, значение столбца rkB/s 107477.33 и 108074.67 для каждого из дисков в софт-рейде. Первым делом стал грешить на Docker, мало ли что происходит в одном из сотни контейнеров. Вполне мог задеплоиться кривой или дырявый релиз софта, однако Docker оказался не причём. Читать далее Почему на сервере Hetzner медленно работает диск

Как установить ping в docker-контейнер?

Может случиться так, что при попытки что-нибудь попинговать изнутри docker-контейнера появиться пренеприятнейшая ошибка:

bash: ping: command not found

Как известно, docker-образы собираются как можно более минималистичными, чтобы не занимать место ненужными командами. Однако, при необходимости всё можно доставить поверх образа. Читать далее Как установить ping в docker-контейнер?

Как в PHPStorm сгенерировать сигнатуры методов для интерфейса?

Достаточно злободневная тема. Допустим, у вас есть некий интерфейс и вам нужно его реализовать. В идеале хотелось бы сгенерировать новый класс который бы содержал все сигнатуры и определения. Но нет. Чтобы провернуть это в PHPStorm потребуется вручную создать новый класс и объявить ему implements AnyInterface. Теперь жмёт Alt + Insert, или в контекстном меню редактора выбираем пункт «Generate…», затем «Implement Methods…», либо сразу нажимайте Control + I. Читать далее Как в PHPStorm сгенерировать сигнатуры методов для интерфейса?

Как на PHP получить timestamp с точностью до наносекунд?

На чистом PHP данная задача не реализуема, но есть небольшой лайфхак:

$nanotime = system('date +%s%N');

В результате $nanotime будет содержать значение: 1523648935928101682, где 1523648935 это привычный всем timestamp, а часть 928101682 собственно наносекунды. Читать далее Как на PHP получить timestamp с точностью до наносекунд?

Как в nano перейти на указанную строку в файле

Способ первый, если файл ещё не открыт, то можно указать строку через аргумент +N, uде N — нудная строка:

nano +10 file.php

Второй способ для перехода на нужную строку прямо в редакторе nano. Нажмите сочетание клавиш Ctrl + «_», на что будет задан вопрос:

Enter line number, column number:

Вводите нужный номер строки и жмите Enter.

Как в Linux получить часть файла по номерам строк?

Достаточно повседневная задача, поделить файл на части не выходя из bash.

sed -n 4646,9999p old.file > new.file

Где 4646 — начальная строка, а 9999 — конечная строка.

Быстрый экспорт данных с джойнами из MySQL в Clickhouse

Подготовка и импорт данных в Clickhouse достаточно обширная тема. В данной заметке приведу рецепт быстрого экспорта данных с джойнами из MySQL в CSV с последующим импортом этих CSV в Clickhouse. В MySQL есть очень полезная директива: INTO OUTFILE, которая в контексте SELECT запросов сохраняет данные в файл на сервере, а не отдаёт клиенту. Важно, что выполнить SELECT с опцией INTO OUTFILE сможет только пользователь имеющий привилегию FILE.

Всё было бы хорошо, если нужно экспортировать одну плоскую таблицу без джойнов даже с десятками миллионов строк это было бы очень быстро. Однако, как только в запрос для экспорта добавляются джойны — время экспорта такого запроса вырастает в десятки и сотни раз, что неприемлемо. Обойти это можно с помощью экспорта данных небольшими пачками, например по 100 000 записей за раз. Читать далее Быстрый экспорт данных с джойнами из MySQL в Clickhouse

Как отладить PHP скрипт в Windows 10 с помощью PHP Storm и xDebug внутри docker-контейнера находящимся на сервере за NAT?

Вопрос отладки PHP-скриптов будоражит умы многих разработчиков. Так же эта инструкция поможет и тем, кто Docker не использует. На самом деле всё очень просто, достаточно прокинуть порт с удалённого сервера на локальный (так называемый remote port forwarding или ssh tunnel), делается это одной командой, но требует предварительной правки конфигов. Начнём. На удалённом сервере нужно поправить конфиг sshd:

nano /etc/ssh/sshd_config

И добавляем в него строку:

GatewayPorts clientspecified

Читать далее Как отладить PHP скрипт в Windows 10 с помощью PHP Storm и xDebug внутри docker-контейнера находящимся на сервере за NAT?

Как на Windows 10 скомпилировать из исходника на Go Lang бинарник для Linux?

Этой заметкой открываю новую рублику по программированию на Go Lang. Один из первых вопросов, которые пришлось решить — как пользователю Windows 10 скомпилировать исполняемый файл для Linux сервера? Процесс сборки бинарного файла на системе одного типа для системы другого типа называется кросскомпиляцией. Ответ достаточно прост, сначала нужно задать константы:

set GOARCH=amd64
set GOOS=linux

Теперь можно компилировать:

go build turboapp.go

Читать далее Как на Windows 10 скомпилировать из исходника на Go Lang бинарник для Linux?

Как запускать cron jobs для docker-контейнеров?

Следуя хорошим практикам работе с Docker, в каждом контейнере должно быть запущено одно и только одно приложение. Как только приложение завершает работу — контейнер останавливается. Эти ограничения заставляют посмотреть на работу с cron задачами по-другому. Конечно, законами физики не запрещено в каждый контейнер устанавливать более одного приложения и запускать крон прямо изнутри контейнера. Однако, это может привести к сложностям и проблемам, особенно когда ваши приложения разрастутся на более чем один сервер. Читать далее Как запускать cron jobs для docker-контейнеров?