Почему могут быть медленными файловые операции PHP?

Есть сайт на битриксе на дедике. При тесрировании в частности дает вот такую картину:
60edd45ae954c531158228.png
Как видно не фонтан. Однако если протестить скорость диска:
root@site ~# hdparm -t /dev/md126 

/dev/md126:
 Timing buffered disk reads: 2532 MB in  3.00 seconds = 843.80 MB/sec
root@site ~# sync; dd if=/dev/zero of=tempfile bs=1M count=1024; sync
1024+0 записей получено
1024+0 записей отправлено
 скопировано 1073741824 байта (1,1 GB), 0,672519 c, 1,6 GB/c

То показатели оч. неплохие. Ещё бы - там nvme. Проверил на VDS'ке с обычным SSD который медленнее чем этот почти вдвое, и получил >44000 фо/с

Как так-то?
PHP 7.4.21
open_basedir не задан
И там и там php - модуль apache.

UPD:
Вот скрипт тестирования скорости файловых операций.
<?
function getmicrotime()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
    
    
$res = array();
$file_name = __DIR__."/../upload/perfmon#i#.php";
$content = "<?\$s='".str_repeat("x", 1024)."';?><?/*".str_repeat("y", 1024)."*/?><?\$r='".str_repeat("z", 1024)."';?>";

for ($j = 0; $j < 4; $j++)
{
    $s1 = getmicrotime();
    for ($i = 0; $i < 100; $i++)
    {
        $fn = str_replace("#i#", $i, $file_name);
    }
    $e1 = getmicrotime();
    $N1 = $e1 - $s1;

    $s2 = getmicrotime();
    for ($i = 0; $i < 100; $i++)
    {
        //This is one op
        $fn = str_replace("#i#", $i, $file_name);
        $fh = fopen($fn, "wb");
        fwrite($fh, $content);
        fclose($fh);
        include($fn);
        unlink($fn);
    }
    $e2 = getmicrotime();
    $N2 = $e2 - $s2;

    if ($N2 > $N1)
        $res[] = 100 / ($N2 - $N1);
}

if (count($res))
    echo array_sum($res) / doubleval(count($res));
else
    echo 0;
  • Вопрос задан
  • 683 просмотра
Решения вопроса 1
Suntechnic
@Suntechnic Автор вопроса
Сам спросил, сам отвечаю:

На результат теста сильно влияет вложенность документрут сайта, так как при open системный вызов lstat вызывается рекурсивно для всего пути, если файл не существует. Подробнее: https://www.linux.org.ru/forum/web-development/164...

Таким образом нет смысла опираться на данные этого теста, так как сайт редко создает несуществующие файлы, разве что при создании файлов кэша. Операция include, не подвержена этой проблеме и вложенность не имеет никакого значения при ней. Так что нет смысла переносить документрут повыше в дереве файловой системы.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
SagePtr
@SagePtr
Еда - это святое
Сталкивался с такой ситуацией, /dev/md очень сильно проседал в производительности по iops. Проблему можно устранить установкой аппаратного рейд-контроллера.
Ответ написан
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
очевидное решение - посмотреть каким образом битрикс получает данное значение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы