Colobridge WIKI

как проверить производительность сервера

Применимость: Linux, Windows

Слова для поиска: benchmark бенчмарк


Как проверить производительность сервера?

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

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

Поэтому для случая виртуального сервера тесты производительности надо повторять не менее трех раз подряд и оценивать среднее значение.

Простой тест диска

Это довольно простой тест позволяющий оценить производительность системы хранения без установки дополнительных специальных утилит.

dd if=/dev/zero of=testfile bs=64k count=16k conv=fdatasync

Значение опций:

  • if=/dev/zero - в качестве источника данных используется псевдо-устройство являющееся генератором нулей
  • of=/test.bin - это файл куда записывается информация. Не забудьте после теста удалить этот файл
  • bs=64k - размер блока данных 64 килобайта
  • count=16k - количество блоков данных записываемых в файл. В итоге получается файл размером 1Гб.
  • conv=fdatasync - физическая запись на диск для исключения влияния кэширования записи

После выполнения команды будет выведена информация о скорости выполнения.

dd if=/dev/zero of=testfile bs=64k count=16k conv=fdatasync
16384+0 записей считано
16384+0 записей написано
 скопировано 1073741824 байта (1,1 GB), 9,30189 c, 115 MB/c

Затем можно оценить скорость чтения:

echo 3 > /proc/sys/vm/drop_caches #очистить кэш
dd if=testfile of=/dev/null bs=64k
2097152+0 записей считано
2097152+0 записей написано
 скопировано 1073741824 байта (1,1 GB), 1,12647 c, 953 MB/c

Здесь команда dd прочитает файл testfile и запишет его в псевдо-устройство /dev/null. Устройство /dev/null это нечто вроде системного шредера или черной дыры для уничтожения всего, что туда попадает.

  • Параметр –size рекомендуется выбирать в 2 раза больше оперативной памяти.
  • Парамтер -directory=<имя> долен укзывать на директорию где у вас достаочно места. Не забудьте после проведения теста удалить файлы.
  • Параметр -bs, если вы хотите оценить максимальную доступную скорость диска, лучше выбрать побольше, например -bs=1M (Это не относится к синтетическому тесту с переменным размером блока)
  • Параметр -iodepth (глубина очереди запросов) рекомендуется выбирать так чтобы результат lat avg (средняя задержка выполнения запроса) получался около 3-10 мсек
  • Параметры -ioengine libaio –direct=1 определяют режим работы с диском через native библиотеку libaio с отключением буферизации.

Тест последовательного чтения:

fio -name test1 --rw=read  -bs=4k -iodepth 64  \
--size=4g  -ioengine libaio --direct=1 -directory=/var/tmp/

Тест последовательной записи:

fio -name test2 --rw=write  -bs=4k -iodepth 64  \
--size=4g  -ioengine libaio --direct=1 -directory=/var/tmp/

Синтетический тест производительности:

Этот тест имитирует работу сильно нагруженного вебсервера. Используется случайное чтение /запись в соотношении 80/20 блоками переменной длинны.

fio -name test3 --rw=randrw --rwmixread=80 -iodepth 64 \
--bssplit=512/22:1k/15:2k/8:4k/23:8k/15:16k/2:32k/6:64k/7:128k/1:512k/1 \
--size=4g  -ioengine libaio --direct=1 -directory=/var/tmp/

Чтобы минимизировать влияние проблем на конктеном сетевом маршруте рекомендуется использовать файл torrent с большим количеством раздающих размещенных на быстрых каналах.

Установите консольную утилиту ctorrent

yum install ctorrent

или для Debian/Ubuntu

apt-get install ctorrent

Скачайте файл торрент

wget http://releases.ubuntu.com/12.04.4/ubuntu-12.04.4-server-amd64.iso.torrent

И запустите закачку.

ctorrent ./ubuntu-12.04.4-server-amd64.iso.torrent

Через пару минут оцените скорость скачивания.

Это и будет скорость канала для вашего сервера.

Установите утилиты time make file gcc

yum install time make file gcc
или для debian | ubuntu
apt-get install time make file gcc

Возможно потребуется еще

yum install perl-Time-HiRes

или

apt-get install  libtime-hires-perl
Внимание - наличие компилятора на сервере является опасным фактором в случае несанкционированного доступа. Удалите его потом если он не нужен.

Скачайте утилиту по ссылке unixbench , распакуйте и запустите.

wget http://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
tar -xzf UnixBench5.1.3.tgz
cd UnixBench
./Run

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

UnixBench состоит из нескольких отдельных тестов, которые ориентированы на конкретные параметры.

Dhrystone

Этот тест используется для измерения и сравнения производительности компьютеров. Тест фокусируется на обработке строк. Результат во многом зависит от аппаратного и программного обеспечения, опций компилятора и компоновщика, оптимизации кода, кэш-памяти, состояния типов данных.

Whetstone

Этот тест измеряет скорость и эффективность операций с плавающей запятой. Используется широкий спектр функций, включая C SIN, COS, SQRT, математические операции, массивы обращений, условные переходы и вызовы процедур.

Execl Throughput

Этот тест измеряет количество execl вызовов в секунду. Execl является частью семейства функций Exec, выполняющих замену текущего образ процесса с новым.

File Copy

Измеряет скорость переноса данных из одного файла в другой с различными размерами буфера за 10 секунд.

Pipe Throughput

Измерение простейшей формы коммуникации между процессами. Измеряет сколько раз в секунду можно записать 512 байт в пайп и прочитать из пайпа.

Pipe-based Context Switching

Этот тест измеряет количество обменов данными через пайп между двумя процессами при котором тестовая программа порождает дочерний процесс, с которым оно осуществляет двунаправленный обмен.

Process Creation

Измерение скорости создания блоков управления и распределения памяти для новых процессов. Результат сильно зависит от пропускной способности памяти.

Shell Scripts

Измерение количество раз в минуту процесс может начаться и обрабатывать набор из одного, двух, четырех и восьми одновременных копий скриптов.

System Call Overhead

Тест оценивает накладные расходы на выполнение системных вызовов.

Графический тест

Тест измеряет 2D и 3D производительность обработки графики. Эти тесты дают очень приблизительное представление о 2D-и 3D-производительности системы и будет зависеть не только от оборудования, но от того какие используются драйверы. Для графических тестов потребуется установка 3dinfo.

Запуск Unixbench

Синтаксис:

Run [ -q | -v ] [-i <n> ] [-c <n> [-c <n> ...]] [test...]                                                                 

The option flags are:

  1. q Run in quiet mode.
  2. v Run in verbose mode.
  3. i <count> Run <count> iterations for each test – slower tests

use <count> / 3, but at least 1. Defaults to 10 (3 for

              slow tests).                                              
-c <n>        Run <n> copies of each test in parallel.                                                                 

The -c option can be given multiple times; for example:

./Run -c 1 -c 4                                                                         

will run a single-streamed pass, then a 4-streamed pass. Note that some tests (currently the graphics tests) will only run in a single-streamed pass. The remaining non-flag arguments are taken to be the names of tests to run. The default is to run «index». See «Tests» below.

Tests

The available tests are organised into categories; when generating index scores (see «The BYTE Index» below) the results for each category are produced separately. The categories are:

 system          The original Unix system tests (not all are actually
                 in the index)
 2d              2D graphics tests (not all are actually in the index)
 3d              3D graphics tests
 misc            Various non-indexed tests

The following individual tests are available:

system:
  dhry2reg         Dhrystone 2 using register variables
  whetstone-double Double-Precision Whetstone
  syscall          System Call Overhead
  pipe             Pipe Throughput
  context1         Pipe-based Context Switching
  spawn            Process Creation
  execl            Execl Throughput
  fstime-w         File Write 1024 bufsize 2000 maxblocks
  fstime-r         File Read 1024 bufsize 2000 maxblocks
  fstime           File Copy 1024 bufsize 2000 maxblocks
  fsbuffer-w       File Write 256 bufsize 500 maxblocks
  fsbuffer-r       File Read 256 bufsize 500 maxblocks
  fsbuffer         File Copy 256 bufsize 500 maxblocks
  fsdisk-w         File Write 4096 bufsize 8000 maxblocks
  fsdisk-r         File Read 4096 bufsize 8000 maxblocks
  fsdisk           File Copy 4096 bufsize 8000 maxblocks
  shell1           Shell Scripts (1 concurrent) (runs "looper 60 multi.sh 1")
  shell8           Shell Scripts (8 concurrent) (runs "looper 60 multi.sh 8")
  shell16          Shell Scripts (8 concurrent) (runs "looper 60 multi.sh 16")
2d:
  2d-rects         2D graphics: rectangles
  2d-lines         2D graphics: lines
  2d-circle        2D graphics: circles
  2d-ellipse       2D graphics: ellipses
  2d-shapes        2D graphics: polygons
  2d-aashapes      2D graphics: aa polygons
  2d-polys         2D graphics: complex polygons
  2d-text          2D graphics: text
  2d-blit          2D graphics: images and blits
  2d-window        2D graphics: windows
3d:
  ubgears          3D graphics: gears
misc:
  C                C Compiler Throughput ("looper 60 $cCompiler cctest.c")
  arithoh          Arithoh (huh?)
  short            Arithmetic Test (short) (this is arith.c configured for
                   "short" variables; ditto for the ones below)
  int              Arithmetic Test (int)
  long             Arithmetic Test (long)
  float            Arithmetic Test (float)
  double           Arithmetic Test (double)
  dc               Dc: sqrt(2) to 99 decimal places (runs
                   "looper 30 dc < dc.dat", using your system's copy of "dc")
  hanoi            Recursion Test -- Tower of Hanoi
  grep             Grep for a string in a large file, using your system's
                   copy of "grep"
  sysexec          Exercise fork() and exec().

The following pseudo-test names are aliases for combinations of other tests:

  arithmetic       Runs arithoh, short, int, long, float, double,
                   and whetstone-double
  dhry             Alias for dhry2reg
  dhrystone        Alias for dhry2reg
  whets            Alias for whetstone-double
  whetstone        Alias for whetstone-double
  load             Runs shell1, shell8, and shell16
  misc             Runs C, dc, and hanoi
  speed            Runs the arithmetic and system groups
  oldsystem        Runs execl, fstime, fsbuffer, fsdisk, pipe, context1,
                   spawn, and syscall
  system           Runs oldsystem plus shell1, shell8, and shell16
  fs               Runs fstime-w, fstime-r, fstime, fsbuffer-w,
                   fsbuffer-r, fsbuffer, fsdisk-w, fsdisk-r, and fsdisk
  shell            Runs shell1, shell8, and shell16
  index            Runs the tests which constitute the official index:
                   the oldsystem group, plus dhry2reg, whetstone-double,
                   shell1, and shell8
                   See "The BYTE Index" below for more information.
  graphics         Runs the tests which constitute the graphics index:
                   2d-rects, 2d-ellipse, 2d-aashapes, 2d-text, 2d-blit,
                   2d-window, and ubgears
  gindex           Runs the index and graphics groups, to generate both
                   sets of index results
  all              Runs all tests

Установите пакет sysbench

apt-get install sysbench

или

yum install sysbench

Для тестирования надо создать отдельную базу test1, пользователя с именем test1 и паролем test1drbdPXZ3

Создаём новую базу данных test1

mysqladmin -u root -p<PASSWORD> create test1

Создаем пользователя с именем test1

echo "GRANT ALL ON test1.* TO 'test1'@'localhost' IDENTIFIED BY 'test1drbdPXZ3'" | mysql -uroot mysql

Для измерения производительности MySQL создаем тестовую таблицу на 1000000 строк в базе данных test1:

sysbench --db-driver=mysql --test=oltp --oltp-table-size=1000000 \
--mysql-db=test1 --mysql-user=test1 --mysql-password=test1drbdPXZ3 prepare

Для оценки времени создания таблицы можно перед командой добавить time

time sysbench ......

После этого можно запустить тест MySQL следующим образом:

sysbench --db-driver=mysql --test=oltp --oltp-table-size=1000000 \
--mysql-db=test1 --mysql-user=test1 --mysql-password=test1drbdPXZ3 \
--max-time=60 --oltp-read-only=on --max-requests=0 --num-threads=8 run

Самый важный параметр в выводе теста - количество транзакций в секунду:

После анализа результатов можно очистить базу

sysbench --db-driver=mysql  --test=oltp --mysql-db=test1 --mysql-user=test1 \
--mysql-password=test1drbdPXZ3 cleanup