В целях отладки недавно ELiS была запущена на процессоре Ryzen 3600 в Hyper-V, и оказалось, что программа на нем работает в 3-4 раза быстрее существующих инсталляций ELiS на Xeon двухлетней давности (vmware, bare metal).
На разницу частот списать не получается (Ryzen - 4 ГГц, Xeon около 3 ГГц).
Там где на Xeon простая страница с 20-30 запросами в базу данных генерируется за 100-140 мс, на Ryzen за 30-40 мс.
Везде SSD, PHP7.2, PostgreSQL 11/12, CentOS 7/8.
Содержание
Что не должно влиять на различие в разы[править]
- Частота: разница не велика, IPC может быть больше на десятки процентов, но не в разы.
- SSD: т.к. страница находится в файловом кеше, чтения с дисков почти нет, а запись сессии - это всего 2-3 запроса.
- Число ядер: PHP работает однопоточно, PostgreSQL тоже однопоточно на одном подключении, поэтому больше двух ядер для обработки одного запроса не нужно, да и те работают по очереди из-за синхронности PHP. При этом попадание в кеш в базе данных высокое, т.к. вначале, конечно, кеш прогревается перед измерением выдачи страницы.
- Версия PHP, ОС, PostgreSQL: небольшие изменения производительности от версии к версии могут быть, но в данном случае изменения производительности в разы быть не могло, т.к. отличия незначительные и в основном заключаются в аппаратной платформе.
- Влияние системы виртуализации: есть инсталляции ELiS на голом железе и там характерные скорости незначительно отличаются от Xeon c ELiS в Hyper-V.
Гипотеза: влияет кеш процессора[править]
Возникла гипотеза, что влияние оказывает большой кеш процессора L3 в Ryzen, который в три раза больше чем на испытуемых Xeon.
В большой кеш может залезть движок PHP Zend, что может дать серьезное ускорение.
Методика тестирования[править]
Задача состояла в том, чтобы забить L3-кеш и посмотреть, происходит ли при этом падение скорости PHP и как.
Но забить кеш надо так, чтобы это не влияло на работу ядер, обрабатывающих PHP.
Тесты проводились на Ryzen 3600, ОС Windows 10, ELiS работала под управлением CentOS8 в Hyper-V.
Первый тест[править]
Вначале написан простой скрипт, который не трогает L3 кеш, а просто утилизирует одно из ядер виртуальной машины с ELiS, суть которого заключалась в бесконечном сложении и вычитании единицы.
<?php while (true) { $i = 1; $i++; $i--; }
Запуск теста показал, что скорость генерации страницы ELiS не изменилась, хоть одно ядро было занято на 100%, на котором был запущен этот тест.
Т.е. загрузка ядра вычислениями, не трогающими L3 кеш на генерацию страницы не влияет.
Второй тест[править]
Идея состоит в том, чтобы прочитать файл в 400 МБ и начать его по бесконечному циклу копировать из строки в строку.
Копирование данных из строки в строку - задача не слишком тяжёлая для процессора, но хорошо утилизирующая память и занимающая кеш L3, эффективно вытесняя из него данные других процессов.
При выполнении копирования строк параллельно измеряется на этой же виртуальной машине скорость работы сайта с ELiS.
Чтобы увеличить нагрузку на кеш L3, копирование строк с помощью скрипта запускалось параллельно от 1 до 4 раз (с утилизацией 1-4 потоков) на виртуальной машине с 6 виртуальными процессорами (два процесса отведены PHP+PostgreSQL).
<?php $file = file_get_contents('test.pdf'); // 400 MB for ($i=0; $i<100000; $i++) { $tmp = $file . ' ' . $i; // copy string $file = null; $file = $tmp . ' ' . $i; // copy string }
Ограничение методики в том, что при копировании строки утилизируется не только кеш, но и шина данных до ОЗУ.
Результаты[править]
При выполнении второго теста выяснилось, что увеличение числа потоков, копирующих строку и утилизирующих L3, происходит снижение скорости генерации страницы сайта на 10 мс на каждый новый поток.
Т.е. при четырех запущенных потоков скорость генерации страницы на Ryzen составляет 70 мс вместо 30 мс, когда ни одного потока копирования строк не запущено.
Обсуждение[править]
Линейное падение скорости вывода простейшей страницы сайта ELiS от числа читающих потоков выглядит как подтверждение гипотезы о хорошем влиянии большого кеша L3 на производительность ELiS, но её следует проверить на Xeon также с большим кешем L3 (такие начали появляться, но недоступны мне для тестирования).
Поэтому предварительно есть рекомендация при выборе процессора для ELiS отдавать предпочтение процессорам с большим L3, может быть даже перед числом ядер или частоте.
Однако там где будет много данных (например для задачи обработки статистики), большой кеш может оказаться не столь эффективным, т.к. обрабатываемые данные будут вытеснять из кеша движок PHP.
Если смотреть современные линейки процессоров, то кеш L3 больше в линейке EPYC.