优化sabre-dav与apache配合时的上传速度
采用sabre/dav进行功能验证时,发现使用NAS在千兆网络环境下不能跑到满速,呈现出前500+MB满速,之后一会儿30+MB/s,一会儿0MB/s,直至文件传输完成
研究后得出以下结果
原因
- apache调用php脚本处理文件上传请求时,会把文件存储在临时目录内,同时,写在临时目录内的临时文件会被读取,以流的方式写入实际存放的路径
- 该临时目录在php.ini中以upload_tmp_dir控制,默认为空,为空时会使用系统本身的临时目录,如/tmp
- /tmp处于系统盘,NAS的系统盘如果使用EMMC,由于EMMC的写性能不高,但有高速缓存,因此呈现了测试时初始满速,后续间歇性传输的特点
验证方法
- 打开/etc/php/7.4/apache2/php.ini
- upload_tmp_dir改为SSD盘所在的某个目录,修改目录权限为777
- systemctl reload apache2
- 可以看到传输速度可以稳定在90~110MB/s
解决方案
- 在apache配置文件处修改upload_tmp_dir
- 针对sabre/dav的上传进行upload_tmp_dir的修改,可以起效
<LocationMatch "^/apps/sabredav-test/test.php/sss/">
php_admin_value upload_tmp_dir /mnt/555/666/sss/temp/
</LocationMatch>
- ^/apps/sabredav-test/test.php是sabre/dav的主php文件路径,/mnt/555/666/sss/temp/是实际处于SSD盘下的某个路径
- php_admin_value可以在apche配置处修改php.ini内某参数的值
- php的ini_set方法虽然也可以修改php.ini内某参数的值,但是等调用到ini_set时,文件上传已经开始了,不能影响已开始上传的过程的速度