我正在编写一个服务器,它将准备好并写入巨大的文件/数据库。
我在很多地方都使用了 Stream 读写函数,我使用 8192 作为缓冲区大小。
我也在从 TCP 套接字读取大量输入。
我不知道将部署服务的虚拟机的配置是什么。
是否有任何内置函数可以用来确定最适合我的服务器的缓冲区大小?
我自己也经常这样想。但最后我不认为有一个通用的规则可以适用。它始终取决于您的特定需求。
根据经验,如果您的缓冲区更大,您需要更少的往返文件系统或数据库,这通常是大多数情况下的最佳选择。
但是,您的系统可以在不创建其他应用程序的情况下一次将多少数据读入内存,很大程度上取决于您的个人环境。某些移动设备的细节可能与您的顶级服务器硬件不同,等等。
其他要考虑的事情是网络带宽和其他共享资源,以及对您的操作的绝对性能影响。
例如,在一个包含数千个图像文件的项目中,经过几次尝试,我们发现 idela 缓冲区大小约为 1 MB。对于大小小于我们使用的缓冲区大小的图像,我们使用的缓冲区大小等于文件大小。对于您的情况,这当然不适合。
微软的性能专家 Rico Mariani 列举了性能编程中最重要的 10 个方面:测量、测量、测量、测量……(你明白了。:-))
关键因素不是应用程序缓冲区的大小,而是套接字发送和接收缓冲区的大小,它必须 >= 链路的带宽延迟乘积。任何高于此的增加都应产生零收益;低于它的任何下降都将在次优带宽中变得可见。应用程序缓冲区在减少系统调用方面可以发挥作用,但 8192 通常足以满足大多数用途,尤其是网络用途。
它取决于生产环境中的吞吐量、通信通道利用率和连接稳定性。
从我的角度来看,这里最好的方法是制作一个自适应算法,它会根据上述因素改变缓冲区大小。
更新。
使用缓冲区时要小心,即等于或大于 85000 字节。此类缓冲区应尽可能多地重复使用(因为 LOH 行为)。