Измерьте пропускную способность с помощью PHP эхо-сервера

1

Я пытаюсь получить некоторую информацию о пропускной способности и задержке с помощью 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);
?>

Может ли любое тело объяснить это странное поведение?

  • 0
    Это может быть связано с вашим браузером. Chrome печально известен тем, что предварительно буферизует 4096 байт перед обработкой фактического запроса. Вы часто сталкиваетесь с проблемой, когда пытаетесь транслировать контент, как здесь: sitepoint.com/php-streaming-output-buffering-explained
  • 0
    Я попытался отменить эту буферизацию вывода, но также происходит то же самое поведение.
Теги:
bandwidth

1 ответ

1
Лучший ответ

Странная вещь, что для пакетов от 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, если вы используете то, что эквивалентно на вашем сервере.

  • 0
    Я думаю, что это не так, потому что сервер уже отвечает на пакеты небольших размеров без буферизации.
  • 0
    Я не изучал исходный код PHP, но не удивлюсь, если буфер, который он использует для ответа, сначала будет выделен значению ini. Так что это буферизовано по умолчанию. Откуда ты знаешь, что это не буферизация?
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню