使用 PHP 回显服务器测量带宽

Measure the bandwidth by using PHP echo server

我正在尝试使用 java 获取有关带宽和延迟的一些信息。 um 所做的就是向 php 服务器发送字节数,然后 php 服务器用这些字节的字符串回复。奇怪的是,对于从 4 字节到 4096 字节的数据包,响应时间几乎是恒定的,但在更大的数据包大小(大于 4KB)下,响应时间线性增加。

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

任何人都可以解释这种奇怪的行为吗?

The strange thing that for packets ranging from 4 bytes to 4096 bytes the response time is almost constant but at larger packet sizes (larger than 4KB)the response time increase linearly.

这可能是由于输出缓冲。如果您查看 output-buffering 部分的 PHP configuration,您可能会看到 4096 字节是输出的默认缓冲区大小。这基本上意味着 PHP 在累积了 4096 字节的信息要发送之前不会满足您的请求。

如果您希望看到所有请求呈线性增长,则需要降低此缓冲区。如果你想要更高的一致性,你会提高它。真的,虽然你可能不应该把它搞得太多。但我假设您只是在享受乐趣并尝试使用该语言。我希望这回答了您为什么会出现这种行为的问题

编辑: 查看 java 源代码以及 HttpUrlConnection 如何处理某些代码后,我想知道添加内容长度 header 是否也会对您有所帮助。

<?php
$bytes = $_GET["bytes"]; 
$temp = intval ($bytes);
$result = str_pad("",$temp,"*");
header('Content-Length: ' . $temp);
echo($result);
?>

Apache 或任何你用来处理请求的东西应该会自动添加它,但尝试明确设置 header 也没什么坏处。关于这一点,您是否考虑过您遇到的 TTFB(第一个字节的时间)问题可能来自服务器本身的开销,而不是 php 代码?你是如何服务于请求的?如果您正在使用 apache 上的 sendbuffersize 配置或服务器上的任何等效配置,请考虑查看它。