Я действительно смущен поведением QEMU / KVM. У меня есть сервер - около 100 ГБ ОЗУ, 2 процессора - 6 ядер + HT и три жестких диска - один для root и два для BTRFS-зеркала для виртуальных машин (HGST HDN724030ALE640, если это важно). ОС - Debian 9.1, QEMU (тип диска - raw, IO - native).
Итак, сервер простаивает - на нем работает только одна виртуальная машина. Это виртуальная машина (Debian 9.1, 16 ГБ ОЗУ, 4 VCPU), на которой работают базы данных PostgreSQL и MySQL. Запросы принимает только один - PostgreSQL (несколько вставок в секунду). И ... на то, чтобы сделать эти вставки, нужно много времени. Я написал простой скрипт, который вставляет данные в очень простую таблицу без каких-либо ограничений или индексов (три поля varchar). Производительность скрипта - 1-2 вставки в секунду. Это очень медленно!
Сначала я подумал, что это проблема Postgres. Но я переписал свой скрипт для MySQL, и он показывает тот же результат. Затем я создаю новую виртуальную машину на FreeBSD, устанавливаю PostgreSQL, создаю ту же базу данных и таблицу из виртуальной машины Linux и снова проверяю производительность - 1-2 вставки в секунду.
Ладно. Посмотрим на iostat и iotop. iotop показывает, что процесс Postgres, который обслуживает мои запросы вставки, потребляет около 60-70% ввода-вывода (для простых вставок!) на ВМ. iostat -x говорит, что теперь использует около 40-45 операций записи в секунду на виртуальной машине и около 80-90 операций записи в секунду на хост-машине.
Я попытался оценить скорость записи с помощью утилиты dd, например:
dd if=/dev/urandom of=/tmp/fooo.bar bs=1M count=1000
и делается это примерно 5-6 секунд.
Затем, пока скрипт выполняет около 100 вставок, я проверяю
/proc/[Postgres_PID]/io file:
rchar: 138544
wchar: 114689
syscr: 39
syscw: 15
read_bytes: 0
write_bytes: 540672
cancelled_write_bytes: 0
Что я делаю не так? Почему у меня такая низкая производительность диска?