2015-06-01 29 views
1

我想了解一些关于使用java的带宽和延迟的信息。所有这些都是发送到php服务器的字节数,php服务器回复这些字节的字符串。奇怪的是,对于从4字节到4096字节的分组,响应时间几乎是恒定的,但在较大分组大小(大于4KB)时,响应时间线性增加。 PS:我试图做流量整形,以减少测量的带宽,但同样的问题发生。使用PHP回显服务器测量带宽

这里是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字节的数据包,响应时间几乎是恒定的,但对于较大的数据包大小(大于4KB),响应时间线性增加。

这可能是由于输出缓冲。如果您在输出缓冲区查看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代码?你如何处理这些请求?考虑看看Apache上的sendbuffersize配置,如果你正在使用它或者你的服务器上有相同的配置。

+0

我认为这不是这种情况,因为服务器已经回复了没有缓冲的小尺寸数据包。 –

+0

我还没有看过PHP源代码,但如果它用于回复的缓冲区先被分配给ini值,我不会感到惊讶。所以它被默认缓冲。你怎么知道它没有缓冲? – EdgeCaseBerg

+0

我想是这样,因为PHP已经发送回应低于4kB的数据包。所以它不会缓冲。 –