TGViewer
Bash Days | Linux | DevOps Bash Days | Linux | DevOps @bashdays · 23.6K subscribers
Post #499 10.3K
И снова здравствуйте. Давай сегодня немного в кишках покопаемся.

Запускаем бессмысленную команду:

dd if=/dev/zero of=/dev/null status=progress


И наблюдаем как строка статистики постоянно меняется.

В простонародье — рефрешится.

4254480896 bytes (4.3 GB, 4.0 GiB) copied, 4.77966 s, 890 MB/s


Бесполезная? Ну не скажи, с её помощью можно протестировать скорость чтения и записи.
ㅤ
Эта команда копирует блоками нули из спец-файла в другой. Записывая статистику на стандартный вывод ошибок stderr.

Строка статистики постоянно меняется. Но как dd это делает? Давай разберемся ниже.

Запускаем страшную кишку и немного ждем

dd if=/dev/zero of=/dev/null status=progress |& { read -t 4; echo "${REPLY@Q}"; }


По итогу получаем, что-то подобное:

$'\r927888896 bytes (928 MB, 885 MiB) copied, 1 s, 928 MB/s\r1851585024 bytes (1.9 GB, 1.7 GiB) copied, 2 s, 926 MB/s\r2749514752 bytes (2.7 GB, 2.6 GiB) copied, 3 s, 917 MB/s'


Портянка с read означает — ждем 4 секунды, считываем первую строчку ввода и сохраняем ее в переменную REPLY, а далее выводим содержимое переменной на экран.

✔ Не так уж и страшно, правда?

Ааа, херовина |& нужна, чтобы объединить stdout и stderr и затем направить его в read.

Ну дак вот.

Получается утилита dd, пишет статистику за секунду в стандартный поток ошибок и затем суёт символ «\r».

Который означает - возврат каретки.

Вот и вся магия.

Делаем хак, чтобы избавиться от возврата каретки:

dd if=/dev/zero of=/dev/null status=progress |& tr '\r' '\n'


Теперь статистика выводится в столбик:

1836032000 copied, 2 s, 918 MB/s
2793336832 copied, 3 s, 931 MB/s
3726170624 copied, 4 s, 932 MB/s
4655933440 copied, 5 s, 931 MB/s


Нагляднее? Конечно!

Что с этим можно сделать? Ну например протестировать скорость чтения и записи, используя разный размер буферов.

Херачим Bash скрипт:


#!/bin/bash

for i in {9..20}
do
bs=$((2**i))
dd bs="$bs" if=/dev/zero of=/dev/null status=progress |& {
mapfile -d$'\r' -n 2; printf '%-8s : %s\n' "$bs" "${MAPFILE[1]}"; }
done

exit


Запускаем и получаем:

512 : 878647296 copied, 1 s, 879 MB/s
1024 : 1618295808 copied, 1 s, 1.6 GB/s
2048 : 3096260608 copied, 1 s, 3.1 GB/s
4096 : 5056294912 copied, 1 s, 5.1 GB/s
8192 : 8047247360 copied, 1 s, 8.0 GB/s


Круто? Да охуеть!

Ну а если нужна статистика за пять секунд. Делаем 5+1 к количеству записей и индексу массива. Массив начинается с нуля. Но можешь это изменить с помощью опции -O.

#!/bin/bash

for i in {9..20}
do
bs=$((2**i))
dd bs="$bs" if=/dev/zero of=/dev/null status=progress |& {
mapfile -d$'\r' -n 6; printf '%-8s : %s\n' "$bs" "${MAPFILE[5]}"; }
done

exit


По итогу имеем статистику за 5 секунд:

512 : 4667945472 copied, 5 s, 934 MB/s
1024 : 8693190656 copied, 5 s, 1.7 GB/s
2048 : 15988561920 copied, 5 s, 3.2 GB/s
4096 : 27510878208 copied, 5 s, 5.5 GB/s
8192 : 39937343488 copied, 5 s, 8.0 GB/s


Вот такие пироги. Теперь можешь тестировать VPSки и писать статью на хабру с бенчмарками.

Давай, увидимся завтра!

tags: #linux #bash
—
🔔 @bashdays
More from @bashdays
  1. Sep 29, 2026Самый жаркий холивар в команде — это не systemd, а какие заказать роллы на всю команду. Од…
  2. Sep 24, 2026Post #1565
  3. Sep 23, 2026Здрасти приехали, решил я в кой-то веке воспользоваться услугами Codex, создал аккаунт, по…
  4. Sep 22, 2026Всем привет, с вами TagdTagd. Сегодня опять поднимем тему архивов, но немного с другой сто…
  5. Sep 15, 2026Всем привет, с вами TagdTagd. И это вторая часть. Практическая. С первой частью можешь озн…
  6. Sep 11, 2026🤖 DevOps в эпоху AI трансформации: что работает уже сейчас! 17 сентября Сбер собирает Dev…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →