Bitrix test

Материал из poiuty wiki
Перейти к: навигация, поиск

Некоторые пользователи определяют качество хостинга по тесту битрикса. Хостеры же пытаются манипулировать этим и показать наибольшее количество баллов по тесту.
В ход идут мощные серверы и крутые системные администраторы. Но что именно тестирует битрикс и как формируется оценка? Разберемся прямо сейчас ;)

MySQL тест

Выполняет несколько раз: 100 select, insert и update. Не воспроизводит реальную нагрузку на базу данных.

select * from b_perf_test WHERE ID = #i#
insert into b_perf_test (REFERENCE_ID, NAME) values (#i#-1, '".str_repeat(«x», 200)."')
update b_perf_test set REFERENCE_ID = ID+1, NAME = '".str_repeat(«y», 200)."' WHERE ID = #i#

php mail тест

Предлагает проверить как быстро будет отправлено письмо.

function GetPHPMailMark() 
{ 
   $res = array(); 
    $addr = "hosting_test@bitrix.ru"; 
    $subj = "Bitrix server test"; 
    $body = "This is test message. Delete it."; 
 
    $s1 = getmicrotime(); 
    bxmail($addr, $subj, $body); 
    $e1 = getmicrotime(); 
    $t1 = $e1 - $s1; 
 
    return $t1; 
}

bxmail -> функция, которая вызывает кастомный класс PHPmailer. Если его нет -> вызывает обычный mail()

function bxmail($to, $subject, $message, $additional_headers="", $additional_parameters="") 
{ 
    if(function_exists("custom_mail")) 
        return custom_mail($to, $subject, $message, $additional_headers, $additional_parameters); 
 
    if($additional_parameters!="") 
        return @mail($to, $subject, $message, $additional_headers, $additional_parameters); 
 
    return @mail($to, $subject, $message, $additional_headers); 
}

Из исходников PHP: функция mail() /ext/standart/mail.c
Определяется пусть к SMTP (/usr/sbin/sendmail)

sendmail_cmd = sendmail_path;

Далее php делает popen к

#ifdef PHP_WIN32
	sendmail = popen_ex(sendmail_cmd, "wb", NULL, NULL TSRMLS_CC);
#else
	/* Since popen() doesn't indicate if the internal fork() doesn't work
	 * (e.g. the shell can't be executed) we explicitly set it to 0 to be
	 * sure we don't catch any older errno value. */
	errno = 0;
	sendmail = popen(sendmail_cmd, "w");
#endif
	if (extra_cmd != NULL) {
		efree (sendmail_cmd);
	}

Далее в popen записывает и закрывает => pclose

	fprintf(sendmail, "To: %s\n", to);
	fprintf(sendmail, "Subject: %s\n", subject);
	if (hdr != NULL) {
		fprintf(sendmail, "%s\n", hdr);
	}
	fprintf(sendmail, "\n%s\n", message);
	ret = pclose(sendmail);

Далее письмо попадает в очередь и уже SMTP отправляет его. Достаточно странно замерять время данный операции.
Ведь оно измеряется в ms. Равносильно что замерять скорость работы echo.

Другие тесты

Тест производительности файловой системы.

В один поток несколько раз создает 100 файлов.

Тест производительности процессора.

1000000 раз изменяет значение переменной, от 0 до 1000000. Работает в один поток.


Формула рейтинга

Формируется рейтинг производительности следующим образом. С помощью javascript делают 10 GET запросов.

<script>
var page_rate_count = 10;
var session_count = <?echo $bSessionDB? '1': '10'?>;
var duration = <?echo CPerfomanceKeeper::IsActive()? 0: intval(COption::GetOptionInt("perfmon", "total_mark_duration", 0))?>;

bitrix.png

Формула.

$result = number_format(doubleval(count($_SESSION["PERFMON_TIMES"]))/array_sum($_SESSION["PERFMON_TIMES"]), 2, ".", " ");

Простым языком.

количество проверок(?) / сумма времени проверок

Например, мы получили значения.

0.0145+0.0132+0.0148+0.0125+0.0135+0.0144+0.0126+0.0145+0.0129+0.0137

Посчитаем по формуле

echo number_format(doubleval(10)/(0.0145+0.0132+0.0148+0.0125+0.0135+0.0144+0.0126+0.0145+0.0129+0.0137), 2, ".", " ");

Получаем результат 73.21.

Заключение

Хостерам xочется пожелать перед тем как проводить тестирование на супер крутом сервере, все же стоит заглянуть в исходники теста ;)

Пользователям - меньше внимания обращать на маркетинг. Реально оценивать сколько ваш сайт потребляет CPU и RAM.
В противном случае вас всегда можно будет легко развести, сказав: "Ваш сайт тормозит? Так это же bitrix! Тяжелый движок, для нормальной работы нужен более дорогой сервер."
И вместо того, чтобы идти по пути оптимизации (настроек сервера), поиска узких мест. Вы будете платить деньги за больший обьем ресурсов. Это не всегда дает положительный результат.
Помню случай, когда человек несколько раз обновлял железо сервера, но MySQL что на старом сервере, что на новом максимум использовал ~500Mb памяти.