部署nginx时,通过linuxjishu/9952.html target=_blank class=infotextkey>mount方式挂NFS文件后,发现大图片在浏览器显示时不完整,原因在于nginx中启用了sendfile。
1、sendfile系统调用,文件数据被copy至内核缓冲区
2、再从内核缓冲区copy至内核中socket相关的缓冲区
3、最后再socket相关的缓冲区copy到协议引擎
相较传统read/write方式,2.1版本内核引进的sendfile已经减少了内核缓冲区到user缓冲区,再由user缓冲区到socket相关缓冲区的文件copy,而在内核版本2.4之后,文件描述符结果被改变,sendfile实现了更简单的方式,系统调用方式仍然一样,细节与2.1版本的不同之处在于,当文件数据被复制到内核缓冲区时,不再将所有数据copy到socket相关的缓冲区,而是仅仅将记录数据位置和长度相关的数据保存到socket相关的缓存,而实际数据将由DMA模块直接发送到协议引擎,再次减少了一次copy操作。
遇到的问题是,图片只显示了上面的一半。
对于一个通过网络挂载了NFS文件系统的root /webroot(比如:NFS或SMB),内核可能无法可靠的通过自己的缓冲区服务于网络文件。
因此,如果出现以上情况,建议禁用sendfile吧。
或许大家有更好的办法,欢迎进入脚本学堂官方QQ群:161228069 进行交流。