Рейтинг:1

AWS i3en.3xlarge действительно мало операций ввода-вывода в секунду

флаг lk

Я только что запустил новый экземпляр ec2 типа i3en.3xlarge. Операционная система — Ubuntu. Я смонтировал хранилище экземпляров NVMe, но каждый тест скорости, который я запускаю, невероятно низок — около 7 тыс. операций ввода-вывода в секунду. Что я делаю не так?

Вот шаги, которые я сделал:

1) Проверьте доступные ssd с помощью nvme -list:

---------------- -------------------- ---------------------------- -------------------------- --------- --------------- ----------- ---------------- --------
/dev/nvme0n1 vol012301587a8724842 Amazon Elastic Block Store 1 8,59 ГБ / 8,59 ГБ 512 Б + 0 Б 1,0     
/dev/nvme1n1 AWS16AAAC6C7BFAC4972 Хранилище инстансов Amazon EC2 NVMe 1 7,50 ТБ / 7,50 ТБ 512 Б + 0 Б 0

2) создайте новую файловую систему xfs для nvme1n1:

sudo mkfs -t xfs /dev/nvme1n1

3) смонтировать в /home

sudo mount /dev/nvme1n1 /home

4) проверить df -h:

    ubuntu@ip-172-31-35-146:/home$ df -h
Используемый размер файловой системы Доступно Использование % Установлено на
/dev/root 7.7G 2.8G 4.9G 37%/
devtmpfs 47G 0 47G 0% /dev
tmpfs 47G 0 47G 0% /dev/shm
tmpfs 9.4G 852K 9.4G 1%/запуск
tmpfs 5.0M 0 5.0M 0% /выполнить/заблокировать
tmpfs 47G 0 47G 0% /sys/fs/cgroup
/dev/loop0 25M 25M 0 100% /snap/amazon-ssm-agent/4046
/dev/loop3 43M 43M 0 100% /snap/snapd/14066
/dev/loop2 68M 68M 0 100% /snap/lxd/21835
/dev/loop1 56M 56M 0 100% /snap/core18/2284
/dev/loop4 62M 62M 0 100% /snap/core20/1242
/dev/loop6 56M 56M 0 100% /snap/core18/2253
/dev/loop5 44M 44M 0 100% /snap/snapd/14549
/dev/loop7 62M 62M 0 100% /snap/core20/1328
tmpfs 9.4G 0 9.4G 0% /выполнить/пользователь/1000
/dev/nvme1n1 6,9T 49G 6,8T 1% /домашний

5) запустить тест с помощью fio:

fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Read_Testing

Результаты Фио:

фио-3.16
Запуск 1 процесса
Rand_Read_Testing: Разметка файла IO (1 файл / 1024МиБ)
Задания: 1 (f=1): [r(1)][100,0%][r=28,5 МБ/с][r=7297 IOPS][эта 00 м:00 с]
Rand_Read_Testing: (groupid = 0, jobs = 1): err = 0: pid = 1701: сб, 29 января, 22:28:17 2022
  чтение: IOPS = 7139, BW = 27,9 МБ/с (29,2 МБ/с) (1024 МБ/36717 мс)
    планка (нсек): мин.=2301, макс.=39139, среднее=2448,98, стандартное отклонение=311,68
    clat (usec): мин.=32, макс.=677, среднее=137,06, стандартное отклонение=26,98.
     широта (usec): мин.=35, макс.=680, среднее=139,59, стандартное отклонение=26,99.
    процентили клата (usec):
     | 1.00=[35], 5.00=[99], 10.00=[100], 20.00=[124],
     | 30.00=[ 125], 40.00=[ 126], 50.00=[ 139], 60.00=[ 141],
     | 70.00=[ 165], 80.00=[ 167], 90.00=[ 169], 95.00=[ 169],
     | 99,00 = [ 172], 99,50 = [ 174], 99,90 = [ 212], 99,95 = [ 281],
     | 99,99=[ 453]
   bw (КиБ/с): минимум = 28040, максимум = 31152, per = 99,82%, среднее значение = 28506,48, стандартное отклонение = 367,13, образцы = 73
   IOPS: мин. = 7010, макс. = 7788, среднее = 7126,59, стандартное отклонение = 91,80, образцы = 73
  лат (усек): 50 = 1,29%, 100 = 9,46%, 250 = 89,19%, 500 = 0,06%, 750 = 0,01%
  процессор: usr=1,43%, sys=2,94%, ctx=262144, majf=0, minf=12
  Глубина ввода-вывода: 1=100,0%, 2=0,0%, 4=0,0%, 8=0,0%, 16=0,0%, 32=0,0%, >=64=0,0%
     отправить: 0=0,0%, 4=100,0%, 8=0,0%, 16=0,0%, 32=0,0%, 64=0,0%, >=64=0,0%
     завершено: 0=0,0%, 4=100,0%, 8=0,0%, 16=0,0%, 32=0,0%, 64=0,0%, >=64=0,0%
     выпущено rwts: всего=262144,0,0,0 коротко=0,0,0,0 удалено=0,0,0,0
     задержка: цель = 0, окно = 0, процентиль = 100,00%, глубина = 1

Выполнить группу состояния 0 (все задания):
   ЧТЕНИЕ: bw=27,9МБ/с (29,2МБ/с), 27,9МБ/с-27,9МБ/с (29,2МБ/с-29,2МБ/с), io=1024МБ (1074МБ), run=36717-36717мс

Статистика диска (чтение/запись):
  nvme1n1: ios=259894/5, слияние=0/3, тики=35404/0, in_queue=35404, использование=99,77%

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

Так я что-то пропустил здесь?

заранее спасибо

Tim avatar
флаг gp
Tim
Надеюсь, кто-то может вам помочь. Если нет, то с такими большими случаями, я думаю, вы можете найти поддержку AWS действительно полезной, поддержка разработчиков не особенно дорогая, и они могут быть действительно полезными.
Рейтинг:1
флаг lk

Благодаря ответу @ shearn89 и поддержке aws я понял, что проблема в том, как я провел тест fio.

Вот что AWS сказал мне:

Начнем с того, что тип экземпляра i3.4xlarge имеет указанное количество операций ввода-вывода в секунду для чтения/записи, равное 825 000 и 360 000 соответственно [1].Такую производительность IOPS можно получить, используя блоки размером до 4 КБ и при насыщении очереди по глубине.

Длина очереди тома — это количество ожидающих запросов ввода-вывода для устройства. Оптимальная длина очереди различается для каждой рабочей нагрузки, в зависимости от чувствительности вашего конкретного приложения к IOPS и задержке. Если ваша рабочая нагрузка не обеспечивает достаточного количества запросов ввода-вывода, чтобы полностью использовать производительность, доступную для вашего тома EBS, ваш том может не обеспечивать IOPS или пропускную способность, которые вы предоставили [2].

Чтобы определить оптимальную длину очереди для вашей рабочей нагрузки на томах с поддержкой SSD, мы рекомендуем установить целевую длину очереди, равную 1 на каждые 1000 доступных операций ввода-вывода в секунду [3]. Увеличение длины очереди полезно до тех пор, пока вы не достигнете заданного значения IOPS, пропускной способности или оптимальной длины системной очереди, которая в настоящее время установлена ​​на 32. Дополнительные сведения о глубине очереди см. в этих сторонних статьях, в которых этот термин объясняется очень подробно. [4][5][6].

Чтобы воспроизвести вашу проблему, я запустил экземпляр того же типа и AMI, создал массив RAID 0, используя 2 устройства хранилища экземпляров NVMe [7], и запустил fio с теми же параметрами, которые вы указали. Результаты аналогичны тому, что вы достигли:

$ sudo fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Read_Testing
IOPS: минимум = 8820, максимум = 9196, средний = 8905,17, стандартное отклонение = 102,04, выборки = 58

$ sudo fio -direct=1 -iodepth=1 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Read_Testing
IOPS: мин. = 1552, макс. = 2012, среднее = 1883,84, стандартное отклонение = 59,06, выборки = 278.

Я повторил приведенный выше тест и смог достичь IOPS для чтения и записи в 824k и 460k соответственно, установив параметры «iodepth=32» и «numjobs=16»:

$ sudo fio --directory=/mnt/raid --name fio_test_file --direct=1 --rw=randread --bs=4k --size=1G --numjobs=16 --time_based --runtime=180 -- group_reporting --norandommap --iodepth=32 --ioengine=libaio
IOPS: минимум = 572631, максимум = 910386, средний = 824619,49, стандартное отклонение = 3518,58, образцы = 5745
   
$ sudo fio --directory=/mnt/raid --name fio_test_file --direct=1 --rw=randwrite --bs=4k --size=1G --numjobs=16 --time_based --runtime=180 -- group_reporting --norandommap --iodepth=32 --ioengine=libaio
IOPS: минимум = 291970, максимум = 509505, средний = 360163,50, стандартное отклонение = 2193,22, образцы = 5760

Напоминаем, что IOPS хранилища экземпляров также зависит от многих факторов, в том числе уже упомянутых выше, таких как тип ввода-вывода, размер блока, размер ввода-вывода, механизм ввода-вывода, глубина ввода-вывода, количество файлов/ устройства и количество потоков/процессов. Для получения дополнительной информации о том, как настроить параметры для оптимизации производительности, обратитесь к этим статьям [8][9][10].

Кроме того, хранилище экземпляров обеспечивает временное хранилище для вашего экземпляра, и данные будут потеряны, если основной диск выйдет из строя или если экземпляр будет остановлен/завершен [11]. Поэтому, если вам требуется постоянное хранилище данных, рассмотрите более надежный вариант, например Amazon EBS [12].

Я надеюсь, что вы найдете информацию выше полезной. Пожалуйста, дайте мне знать, если у вас возникнут дополнительные технические вопросы.

Спасибо.

Рейтинг:0
флаг cn

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

  1. Сначала разбейте диск с помощью расстались
  2. Сделать файловую систему
  3. Гора в /опт как /дом уже был там и имел домашний каталог моего пользователя в (убунту).
  4. подходящее обновление && подходящее обновление, затем установите фио
  5. Запустите ту же команду, что и вы: fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Read_Testing изнутри /опт, с судо.

Я получил аналогичные результаты, с чтение: IOPS=7147.

Затем я провел еще один тест:

/opt$ sudo fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=8G --readwrite=randrw --rwmixread=75
fiotest: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
фио-3.16
Запуск 1 процесса
fiotest: Выкладывание файла IO (1 файл / 8192МиБ)
Задания: 1 (f=1): [m(1)][100,0%][r=332МиБ/с,w=109МиБ/с][r=85,1k,w=28,0k IOPS][эта 00м:00с]
fiotest: (groupid = 0, jobs = 1): err = 0: pid = 26470: понедельник, 31 января, 09:14:45 2022
  чтение: IOPS = 91,5 тыс., BW = 357 МБ/с (375 МБ/с) (6141 МБ/17187 мс)
   bw (КиБ/с): мин.=339568, макс.=509896, пер.=100,00%, среднее=366195,29, стандартное отклонение=59791,96, выборки=34
   IOPS: мин.=84892, макс.=127474, среднее=91548,82, стандартное отклонение=14947,99, выборки=34
  запись: IOPS=30,5k, BW=119МБ/с (125МБ/с)(2051МБ/17187мс); 0 сброс зоны
   bw (КиБ/с): мин.=111264, макс.=170424, пер.=100,00%, среднее=122280,71, стандартное отклонение=20225,33, выборки=34
   IOPS: минимум = 27816, максимум = 42606, средний = 30570,18, стандартное отклонение = 5056,32, образцы = 34
  процессор: usr=19,73%, sys=41,60%, ctx=742611, majf=0, minf=8
  Глубина ввода-вывода: 1=0,1%, 2=0,1%, 4=0,1%, 8=0,1%, 16=0,1%, 32=0,1%, >=64=100,0%
     отправить: 0=0,0%, 4=100,0%, 8=0,0%, 16=0,0%, 32=0,0%, 64=0,0%, >=64=0,0%
     завершено: 0=0,0%, 4=100,0%, 8=0,0%, 16=0,0%, 32=0,0%, 64=0,1%, >=64=0,0%
     выдано rwts: всего=1572145,525007,0,0 шорт=0,0,0,0 выпало=0,0,0,0
     задержка: цель = 0, окно = 0, процентиль = 100,00%, глубина = 64

Выполнить группу состояния 0 (все задания):
   ЧТЕНИЕ: bw=357МБ/с (375МБ/с), 357МБ/с-357МБ/с (375МБ/с-375МБ/с), io=6141МБ (6440МБ), run=17187-17187мс
  ЗАПИСЬ: bw=119МБ/с (125МБ/с), 119МБ/с-119МБ/с (125МБ/с-125МБ/с), io=2051МБ (2150МБ), run=17187-17187мс

Статистика диска (чтение/запись):
  nvme1n1: ios=1563986/522310, слияние=0/0, тики=927244/24031, in_queue=951275, использование=99,46%

...что выглядит намного лучше - чтение: IOPS = 91,5 тыс..

Я подозреваю, что это связано с тем, как работает тест только для чтения? Или какой-то нюанс чтения с диска, на котором вы находитесь, и какое-то другое ограничение?

Я провел тест еще пару раз и каждый раз получал одинаковые результаты.

Затем я запустил еще один тест только для чтения, используя команду из здесь, и получил это:

/opt$ sudo fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=8G --readwrite=прочитать
fiotest: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
фио-3.16
Запуск 1 процесса
Задания: 1 (f=1): [r(1)][100,0%][r=332МиБ/с][r=85,1k IOPS][эта 00 м:00 с]
fiotest: (groupid = 0, jobs = 1): err = 0: pid = 26503: понедельник, 31 января, 09:17:57 2022
  чтение: IOPS = 88,6 тыс., BW = 346 МБ/с (363 МБ/с) (8192 МБ/23663 мс)
   bw (КиБ/с): мин.=339560, макс.=787720, пер.=100,00%, среднее=354565,45, стандартное отклонение=72963,81, выборки=47
   IOPS: минимум = 84890, максимум = 196930, средний = 88641,40, стандартное отклонение = 18240,94, образцы = 47
  процессор: usr=15,37%, sys=31,05%, ctx=844523, majf=0, minf=72
  Глубина ввода-вывода: 1=0,1%, 2=0,1%, 4=0,1%, 8=0,1%, 16=0,1%, 32=0,1%, >=64=100,0%
     отправить: 0=0,0%, 4=100,0%, 8=0,0%, 16=0,0%, 32=0,0%, 64=0,0%, >=64=0,0%
     завершено: 0=0,0%, 4=100,0%, 8=0,0%, 16=0,0%, 32=0,0%, 64=0,1%, >=64=0,0%
     выпущено rwts: всего = 2097152,0,0,0 коротко = 0,0,0,0 удалено = 0,0,0,0
     задержка: цель = 0, окно = 0, процентиль = 100,00%, глубина = 64

Выполнить группу состояния 0 (все задания):
   ЧТЕНИЕ: bw=346МБ/с (363МБ/с), 346МБ/с-346МБ/с (363МБ/с-363МБ/с), io=8192МБ (8590МБ), run=23663-23663мс

Статистика диска (чтение/запись):
  nvme1n1: ios=2095751/1, слияние=0/0, тики=1468160/0, in_queue=1468159, использование=99,64%

Так намного лучше производительность чтения. Я подозреваю, что аргументы, которые вы дали своей команде, не позволяют тесту получить максимальную производительность от диска, возможно, из-за размера блока, размера файла и т. д. Я заметил, что все они были аргументами с одним пунктиром (например, -бс=4к) не двойной (--bs=4k), поэтому они могут даже не анализироваться правильно...

Raphael Noero avatar
флаг lk
Большое спасибо за этот изощренный ответ. Я думаю, что вы правы, и это похоже на то, что мне сказали в поддержке aws.

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

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.