通过curlapi下载Curl非常慢

通过curlapi下载Curl非常慢,curl,libcurl,Curl,Libcurl,我正在使用CURL库下载一个文件。我们将https://与TLS 1.2一起使用。 使用的Curl版本是7.48.0。我们正在观察一个奇怪的问题。对于224MB的文件大小,Curl下载在服务器和客户端之间的工作速度非常慢。如果我们使用curl的命令行工具,它的速度非常快,但是如果我们从应用程序端调用“curl\u easy\u perform”,情况就不同了 此外,我们使用--libcurl选项来检查命令行和代码之间的差异,但是没有。我们使用与命令行工具相同的选项,但通过直接调用curl\u e

我正在使用CURL库下载一个文件。我们将https://与TLS 1.2一起使用。 使用的Curl版本是7.48.0。我们正在观察一个奇怪的问题。对于224MB的文件大小,Curl下载在服务器和客户端之间的工作速度非常慢。如果我们使用curl的命令行工具,它的速度非常快,但是如果我们从应用程序端调用“curl\u easy\u perform”,情况就不同了

此外,我们使用--libcurl选项来检查命令行和代码之间的差异,但是没有。我们使用与命令行工具相同的选项,但通过直接调用curl\u easy\u perform下载时速度非常慢

如果我们从其他服务器和同一个客户机上下载,效果会很好。然而,只有使用特定的服务器,我们才会遇到下载时间问题。
进一步调试,我们发现netstat输出显示tcp套接字的接收队列非常高。然而,不清楚为什么只有通过我们的程序,而不是通过命令行,才会出现这个问题,即使设置了相同的选项

事实证明,问题是因为写回调用,这需要花时间使用此服务器。在应用层的写回调用中,我们完成了malloc、memcpy和free来复制接收到的新数据。除一台服务器外,所有服务器都可以正常工作。与此服务器连接的不同之处在于,Curl在写回调用中提供16378字节,后面是6字节的数据,而对于其他工作正常的服务器,它总是提供16384字节的数据。这与设备上默认为套接字缓冲区设置的rmem_最大大小相同。不知道为什么对于一个特定的服务器(Wildfly),它会分解为16378个字节,后跟6个字节。这将导致连续的malloc、memcpy和224mb文件大小的免费下载周期。因此,从套接字读取的速度非常慢,导致下载速度慢。在Curl命令行工具中,写回调用以不同的方式写入,即在接收数据时定期调用fwrite,然后在接收所有数据后调用fclose,打开文件并将数据写入该文件。与malloc、memcpy和free操作相比,这是非常快速的操作。所以curl命令行工具可以很好地用于下载相同的文件。我们更改了回写调用,使之与curl命令行的功能保持一致,从而解决了这个问题。
但是,对于这个特定的服务器,通过Curl将数据划分为16378+6字节的原因还不清楚,我将进一步研究

事实证明,问题是因为写回调用,这需要花时间使用此服务器。在应用层的写回调用中,我们完成了malloc、memcpy和free来复制接收到的新数据。除一台服务器外,所有服务器都可以正常工作。与此服务器连接的不同之处在于,Curl在写回调用中提供16378字节,后面是6字节的数据,而对于其他工作正常的服务器,它总是提供16384字节的数据。这与设备上默认为套接字缓冲区设置的rmem_最大大小相同。不知道为什么对于一个特定的服务器(Wildfly),它会分解为16378个字节,后跟6个字节。这将导致连续的malloc、memcpy和224mb文件大小的免费下载周期。因此,从套接字读取的速度非常慢,导致下载速度慢。在Curl命令行工具中,写回调用以不同的方式写入,即在接收数据时定期调用fwrite,然后在接收所有数据后调用fclose,打开文件并将数据写入该文件。与malloc、memcpy和free操作相比,这是非常快速的操作。所以curl命令行工具可以很好地用于下载相同的文件。我们更改了回写调用,使之与curl命令行的功能保持一致,从而解决了这个问题。 但是,对于这个特定的服务器,通过Curl将数据划分为16378+6字节的原因还不清楚,我将进一步研究