Я пытаюсь получить некоторую информацию о пропускной способности и задержке с помощью java. Все, что делает um, отправляет на 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 echo
<?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, если вы используете то, что эквивалентно на вашем сервере.