Стресс-тестирование серверов с помощью stress-ng

Стресс-тестирование удобно использовать и для облачных и для физических серверов. Если вы работаете в облаках, вы сможете понять реальную пропускную способность узла. Если разворачиваете систему на физическом железе — сможете убедиться, что с железом все в порядке.

В .io мы используем более 100 физических серверов (кроме облачных) для обслуживания системы хранения и обработки статистики. Мы иногда сталкиваемся с багами даже на новых серверах. Проблемы могут быть разными — кулер на процессоре, из-за чего процессор во время работы может переходить в режим throttling (искусственное понижение частоты). Диск с багами (один из двух в RAID'e). Либо еще какая-нибудь муть.

Стресс-тест позволяет сгенерировать нагрузку на все ключевые подсистемы сервера. Это дает возможность убедиться, что все компоненты работают нормально.

Инструменты для стресс-тестов

Инструментов для стресс тестирования есть целая куча, мы остановились на stress-ng (мы используем Ubuntu в качестве ОСи).

Обратите внимание, что стресс-тест — это внутренний тест. В отличие от инструментов нагрузочного тестирования, например ab, стресс-тесты не заключаются в генерации запросов к внешним сервисам.

Инструмент устанавливается из пакетов:

apt-get install stress-ng

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

Тестирование CPU

Прежде всего мы захотим проверить работу процессора.

stress-ng --class cpu --sequential 8 --timeout 60s --metrics-brief

# проводим тест процессора в 8 потоков

В этом тесте stress-ng выполнит разные тесты из группы cpu в 8 потоков (т.к. у нас 8 ядер), каждый длительностью в 60 секунд. Для тестирования будут последовательно использованы различные методы (например, подсчет общего наибольшего делителя или функции Аккермана). Будут выполняться не только математические операции, а и сортировки, шифрование, сжатие, поиск, работа со строками и т.п.

Во время тестов все ядра будут максимально загружены (результат htop):

После теста мы увидим статистику выполнения всех 22х тестов процессора:

stress-ng: info:  [6073] stressor      bogo ops real time  usr time  sys time   bogo ops/s   bogo ops/s
stress-ng: info:  [6073]                          (secs)    (secs)    (secs)   (real time) (usr+sys time)
stress-ng: info:  [6073] af-alg       115214848     60.03      5.24    474.46   1919440.07    240181.05
stress-ng: info:  [6073] bsearch         156484     60.00    479.60      0.00      2608.01       326.28
stress-ng: info:  [6073] context        2548147     60.00    240.41    239.15     42469.14      5313.51
stress-ng: info:  [6073] cpu             115337     60.02    479.75      0.00      1921.49       240.41
stress-ng: info:  [6073] cpu-online         458     60.59      0.55      3.15         7.56       123.78
stress-ng: info:  [6073] crypt            51219     60.00    479.58      0.00       853.61       106.80
stress-ng: info:  [6073] getrandom      1255727     60.00      0.01    478.74     20928.74      2622.93
stress-ng: info:  [6073] heapsort          1789     60.00    479.55      0.01        29.82         3.73
stress-ng: info:  [6073] hsearch        1486425     60.00    479.49      0.00     24773.70      3100.01
stress-ng: info:  [6073] longjmp       43395789     60.00    479.61      0.00    723263.64     90481.41
stress-ng: info:  [6073] lsearch           3431     60.00    479.61      0.00        57.18         7.15
stress-ng: info:  [6073] matrix         1403584     60.00    479.57      0.00     23393.08      2926.76
stress-ng: info:  [6073] mergesort        62685     60.00    478.97      0.02      1044.75       130.87
stress-ng: info:  [6073] qsort             4505     60.00    479.50      0.01        75.08         9.40
stress-ng: info:  [6073] rdrand        93458694     60.00    479.64      0.00   1557645.83    194851.75
stress-ng: info:  [6073] str           16492215     60.00    479.59      0.00    274870.39     34388.15
stress-ng: info:  [6073] stream           26741     60.01    477.74      0.05       445.62        55.97
stress-ng: info:  [6073] tsc          558813483     60.00    479.65      0.00   9313568.26   1165044.27
stress-ng: info:  [6073] tsearch           3540     60.04    479.61      0.00        58.96         7.38
stress-ng: info:  [6073] vecmath       10179903     60.00    479.60      0.00    169665.15     21225.82
stress-ng: info:  [6073] wcs            4452607     60.00    479.58      0.00     74210.12      9284.39
stress-ng: info:  [6073] zlib              7667     60.16    480.79      0.02       127.43        15.95

# показатели после выполнения теста

Статистика будет включать название теста и цифры по скорости выполнения операций. Абсолютные величины особого значения не имеют. Однако их стоит сравнивать с цифрами серверов аналогичной конфигурации. Особенно цифры в колонках bogo ops/s.

Тестирование оперативной памяти

Для оперативной памяти есть группа тестов, куда входят операции выделения, копирования и очистки памяти. Кроме этого, в этот набор входят некоторые тесты из класса cpu. Например, тест компрессии и сортировки.

stress-ng --class memory --sequential 8 --timeout 60s --metrics-brief

# группа тестов для оперативной памяти

Во время этого теста будем наблюдать другую картинку — большое количество оперативной памяти (и свопа) будет занято:

После окончания увидим резюме пройденных тестов:

stress-ng: info: [22818] stressor      bogo ops real time  usr time  sys time   bogo ops/s   bogo ops/s
stress-ng: info: [22818]                          (secs)    (secs)    (secs)   (real time) (usr+sys time)
stress-ng: info: [22818] brk           11133716     60.57      2.17     76.51    183827.09    141506.30
stress-ng: info: [22818] bsearch         153344     60.00    477.83      0.02      2555.66       320.90
stress-ng: info: [22818] hsearch        1481213     60.00    477.78      0.01     24686.84      3100.13
stress-ng: info: [22818] lsearch           3252     60.01    478.05      0.01        54.19         6.80
stress-ng: info: [22818] malloc        29479834     60.09    450.03     25.40    490593.76     62006.68
stress-ng: info: [22818] memcpy          113027     60.00    475.77      0.01      1883.73       237.56
stress-ng: info: [22818] mincore       17446227     60.00     42.99    434.86    290770.63     36509.84
stress-ng: info: [22818] null         3230050466     60.00     97.80    380.23  53834181.55   6757003.67
stress-ng: info: [22818] pipe         189110658     60.00     95.79    382.06   3151840.67    395753.18
stress-ng: info: [22818] qsort             4283     60.03    478.03      0.00        71.35         8.96
stress-ng: info: [22818] tsearch           4140     60.03    477.78      0.00        68.96         8.67
stress-ng: info: [22818] vm             8546560     60.00    473.77      3.71    142436.13     17899.30
stress-ng: info: [22818] vm-rw            21238     60.01      0.21    469.21       353.92        45.24
stress-ng: info: [22818] zero         1118192157     60.00     38.27    439.75  18636544.45   2339216.26

# показатели после выполнения теста

Тестирование дисков

Тут есть две группы тестов, которые стоит выполнить. Сначала — группа тестирования низкого уровня I/O устройств:

stress-ng --class io --sequential 8 --timeout 60s --metrics-brief

Эта группа тестов включает создание/удаление файлов, запись блоков в файлы и синхронизацию данных в файлах с диском. Результат работы тестов:

stress-ng: info:  [11309] aio          128372945     60.00     69.77    408.84   2139548.19    268220.36
stress-ng: info:  [11309] aio-linux      1927396     60.13    258.22    220.36     32055.94      4027.32
stress-ng: info:  [11309] hdd             786432     74.18      0.21     28.70     10601.49     27202.77
stress-ng: info:  [11309] readahead    441786979     60.15     38.26    404.91   7344380.46    996879.25
stress-ng: info:  [11309] seek           1568009     60.02      1.04     82.87     26124.47     18686.80
stress-ng: info:  [11309] sync-file         8876     60.01     21.13    117.76       147.92        63.91

Кроме этого имеет смысл запустить стресс-тест файловой системы. Он включает создание/удаление файлов и папок, перемещение по дереву файлов, создание ссылок, блокировки, переименование и т.п.

stress-ng --class filesystem --sequential 8 --timeout 60s --metrics-brief

Во время тестирования дисковой подсистемы, можно наблюдать нагрузку на диск с помощью утилиты iostat:

iostat 5 -y

# Покажет статистику работы дисков за последние 5 секунд

Результат выполнения тестов файловой системы:

stress-ng: info:  [12865] stressor      bogo ops real time  usr time  sys time   bogo ops/s   bogo ops/s
stress-ng: info:  [12865]                          (secs)    (secs)    (secs)   (real time) (usr+sys time)
stress-ng: info:  [12865] chdir            19830     60.10      5.75    460.77       329.96        42.51
stress-ng: info:  [12865] chmod           806679     60.00      1.38    372.56     13444.65      2157.24
stress-ng: info:  [12865] dentry         4917506     60.04     19.03    194.20     81897.94     23061.98
stress-ng: info:  [12865] dir            1228800     60.59      3.05     54.29     20280.12     21430.07
stress-ng: info:  [12865] dup          2063319701     60.00    110.33    369.29  34388683.03   4301988.45
stress-ng: info:  [12865] eventfd      144698784     60.00     34.29    445.27   2411643.14    301732.39
stress-ng: info:  [12865] fallocate         1600     60.01      0.35     13.36        26.66       116.70
stress-ng: info:  [12865] fcntl        344187771     60.00    132.90    346.80   5736472.46    717506.30
stress-ng: info:  [12865] fiemap          153321     60.02      1.02    414.63      2554.48       368.87
stress-ng: info:  [12865] flock          9337301     60.00      0.97    313.68    155621.73     29675.20
stress-ng: info:  [12865] fstat           272440     60.03      0.40      4.99      4538.28     50545.45
stress-ng: info:  [12865] getdent       22444354     60.00     13.87    463.80    374073.37     46987.15
stress-ng: info:  [12865] iosync         1106646     60.00      0.66    136.86     18444.01      8047.16
stress-ng: info:  [12865] inotify           6089     60.01     15.80      0.00       101.47       385.38
stress-ng: info:  [12865] lease         38122684     60.00     26.03    453.26    635375.77     79539.91
stress-ng: info:  [12865] link          35471509     60.04     41.14    217.34    590749.75    137231.16
stress-ng: info:  [12865] lockf         12893276     60.00      2.33    477.04    214886.95     26896.29
stress-ng: info:  [12865] mknod          9016351     60.07     22.98    218.11    150108.30     37398.28
stress-ng: info:  [12865] open         170092328     60.00      7.15    471.97   2834874.01    355009.87
stress-ng: info:  [12865] procfs               8     60.01     10.82    468.47         0.13         0.02
stress-ng: info:  [12865] rename               8      0.00      0.00      0.00     43039.19         0.00
stress-ng: info:  [12865] symlink        1698219     60.34      5.84    133.24     28145.33     12210.38
stress-ng: info:  [12865] sync-file        15609     60.01     33.81    188.49       260.13        70.22
stress-ng: info:  [12865] utime        113807443     60.00      8.75    470.62   1896793.03    237410.44
stress-ng: info:  [12865] xattr            45397     60.01     12.90    181.27       756.55       233.80

TL;DR

Используйте инструменты стресс-тестирования, чтобы проверить работу железа и понять его реальную производительность. stress-ng — удобный инструмент для тестирования серверов на Ubuntu. Если нужно просто выполнить все тесты, используйте команду:

stress-ng --sequential 4 --timeout 60s --metrics-brief

# Выполнит более 40 различных стресс-тестов сервера

Во время выполнения тестов комп лучше не трогать. После выполнения статистика будет выведена прямо в консоли.


Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень