2015-06-01 9 views
1

Я пытаюсь получить некоторую информацию о пропускной способности и задержке с помощью java. Все, что делает um, отправляет на php-сервер количество байтов, а php-сервер отвечает на строку с этими байтами. Странная вещь, что для пакетов от 4 до 4096 байт время отклика почти постоянное, но при больших размерах пакетов (больше 4 КБ) время отклика увеличивается линейно.Измерьте пропускную способность с помощью PHP-сервера эха

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); 
?> 

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

+0

Возможно, это связано с вашим браузером. Chrome относится к предварительному буферизации 4096 байт, прежде чем обслуживать фактический запрос. Вы часто сталкиваетесь с проблемой при попытке потока контента, например здесь: http://www.sitepoint.com/php-streaming-output-buffering-explained/ – EdgeCaseBerg

+0

Я попытался отменить эту буферизацию вывода, но также и тот же происходит поведение. –

ответ

1

Странная вещь, которая для пакетов от 4 байт до 4096 байт время отклика почти постоянна, но при больших размерах пакетов (более 4 КБ) время отклика увеличивается линейно.

Это, вероятно, связано с выходной буферизацией. Если вы посмотрите на свой PHP configuration в секции буферизации вывода, вы, вероятно, увидите, что размер файла 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. Таким образом, он буферизуется по умолчанию. Откуда вы знаете, что это не буферизация? – EdgeCaseBerg

+0

Я так думаю, потому что php уже отправил ответ на пакеты ниже 4kB. поэтому он не буферизуется. –