Я пытаюсь получить некоторую информацию о пропускной способности и задержке с помощью Java. Все, что вы делаете — это отправляете на php-сервер количество байтов, и php-сервер отвечает строкой этих байтов. Странно то, что для пакетов размером от 4 до 4096 байт время отклика почти постоянно, но при больших размерах пакетов (более 4 КБ) время отклика линейно увеличивается.
PS: я попытался сделать формирование трафика, чтобы уменьшить пропускную способность для измерения, но та же самая проблема возникает.
Вот код Java
public void measure() throws IOException {
timeArray = new double[sizeArray.length];
for (int i = 0; i < sizeArray.length; i++) {
URL url = new URL("http://10.10.10.101/test.php?bytes=" +sizeArray[i]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
try {
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
DataInputStream in = new DataInputStream (connection.getInputStream ());
long start = System.nanoTime();
byte [] temp = new byte[sizeArray[i]];
in.readFully(temp);
long end = System.nanoTime();
System.out.println("Size = " + sizeArray[i] + " , time = "+(end - start) +" ");
in.close();
//linear.addPoint(k[i] * Math.pow(10, -6) , (end - start) * Math.pow(10, -9));
// simple.addData(k[i] * Math.pow(10, -6) , (end - start) * Math.pow(10, -9));
timeArray[i] = (end - start);
} finally {
connection.disconnect();
}
}
}
и вот код для эхо-сервера php
<?php
$bytes = $_GET["bytes"];
$temp = intval ($bytes);
$result = str_pad("",$temp,"*");
echo($result);
?>
Может ли кто-нибудь объяснить это странное поведение?
Странно то, что для пакетов размером от 4 до 4096 байт время отклика почти постоянно, но при больших размерах пакетов (более 4 КБ) время отклика линейно увеличивается.
Вероятно, это связано с буферизацией вывода. Если вы посмотрите на свой Конфигурация PHP в разделе буферизации вывода вы, вероятно, увидите, что 4096 байт — это размер буфера по умолчанию для вывода. По сути это означает, что PHP не будет обслуживать ваш запрос, пока не накопит 4096 байт информации для отправки.
Если вы хотите увидеть линейное увеличение по всему запросу, вам нужно уменьшить этот буфер. Если вы хотите более высокую последовательность, вы повысите ее. На самом деле, хотя вы, вероятно, не должны слишком много возиться с этим. Но я предполагаю, что вы просто развлекаетесь и экспериментируете с языком. Я надеюсь, что это ответило на ваш вопрос, почему поведение
Редактировать:
После просмотра исходного кода java и того, как HttpUrlConnection обрабатывает часть кода, мне интересно, поможет ли вам добавление заголовка длины содержимого.
<?php
$bytes = $_GET["bytes"];
$temp = intval ($bytes);
$result = str_pad("",$temp,"*");
header('Content-Length: ' . $temp);
echo($result);
?>
Apache или все, что вы используете для обслуживания запросов, должно добавлять его автоматически, но не мешало бы попытаться установить заголовок явно. И на этой ноте, вы считаете, что проблема TTFB (время до первого байта), с которой вы столкнулись, может быть связана с издержками на самом сервере, а не с кодом php? Как вы обслуживаете запросы? Рассмотреть вопрос о sendbuffersize Конфигурация на Apache, если вы используете это или любой другой эквивалент на вашем сервере.
Других решений пока нет …