
## sendfile()對nginx性能的提升
Linux kernel 2.2之前,(如圖)讀寫數據基本都是使用read系統調用和write系調用.
以nginx來說如果一個請求建立,從磁盤的文件到網絡連接之間會通過硬件(DMA)---內核層---用戶層多次讀寫系統來完成文件數據的復制傳輸:從內核層用read系統調用讀到用戶層,再從用戶層用write系統調用寫到內核層,每一次用戶層到內核層的進行一次上下文轉換,這種代價是非常昂貴的,甚至在沒有數據變化時這種復制尤其顯得多余。
如果nginx接受大量并發請求,這種系統調用就會非常頻繁,服務器的性能就會下降。

在Linux kernel2.2版本之后出現了一種叫做“零拷貝(zero-copy)”系統調用機制,目前很多應用服務器如apache、samba、nginx都支持sendfile。注意:sendfile系統調用是一種文件傳輸的系統調用和kernel系統調用關系不大。

> 如圖所示,nginx在支持了sendfile系統調用后,避免了內核層與用戶層的上線文切換(content swith)工作,大大減少了系統性能的開銷。
## 如何使用
**配置示例**
```
http {
# other directives
sendfile on;
# other directives
}
```
**指令說明**
語法:` sendfile on | off;`
默認值:` sendfile off;`
上下文:` http,server,location,if in location`
指定是否使用sendfile系統調用來傳輸文件。
> sendfile系統調用在兩個文件描述符之間直接傳遞數據(完全在內核中操作),從而避免了數據在內核緩沖區和用戶緩沖區之間的拷貝,操作效率很高,被稱之為零拷貝。
原理解釋:`read/write`在傳統的文件傳輸方式(read、write/send方式),具體流程細節如下:
1、調用read函數,文件數據拷貝到內核緩沖區
2、read函數返回,數據從內核緩沖區拷貝到用戶緩沖區
3、調用write/send函數,將數據從用戶緩沖區拷貝到內核socket緩沖區
4、數據從內核socket緩沖區拷貝到協議引擎中
5、在這個過程當中,文件數據實際上是經過了四次拷貝操作:
> 硬盤—>內核緩沖區—>用戶緩沖區—>內核socket緩沖區—>協議引擎
### sendfile
sendfile系統調用則提供了一種減少拷貝次數,提升文件傳輸性能的方法。
* sendfile系統調用利用DMA引擎將文件數據拷貝到內核緩沖區,之后數據被拷貝到內核socket緩沖區中
* DMA引擎將數據從內核socket緩沖區拷貝到協議引擎中
這里沒有用戶態和內核態之間的切換,也沒有內核緩沖區和用戶緩沖區之間的拷貝,大大提升了傳輸性能。
這個過程數據經歷的拷貝操作如下:
> 硬盤—>內核緩沖區—>內核socket緩沖區—>協議引擎
- 序言
- Nginx從入門到實踐
- 第一章 前言
- 第二章 基礎篇
- 2-1 什么是Nginx?
- 2-2 常見的中間件服務
- 2-3 Nginx特性-多路復用
- 2-4 Nginx特性-輕量級
- 2-5 Nginx特性-Cpu親和
- 2-6 Nginx特性_實現優點4
- 2-7 Nginx的快速安裝
- 2-8 Nginx安裝目錄
- 2-9 Nginx編譯配置參數
- 2-10 Nginx默認配置語法
- 2-11 Nginx默認站點啟動
- 2-12 HTTP請求
- 2-13 Nginx日志
- 2-14 Nginx模塊介紹
- 2-15 Nginx的請求限制
- 2-16 Nginx的訪問控制
- 第三章 場景實踐篇
- 3-1 Nginx作為靜態資源web服務
- 1、靜態資源類型
- 2、CDN場景
- 3、配置語法
- 4、場景演示
- 5、瀏覽器緩存原理
- 6、跨站訪問
- 7、防盜鏈
- 3-2 Nginx作為代理服務
- 1、代理服務.
- 2、反向代理配置場景
- 3、正向代理配置場景
- 4、代理配置和規范
- 3-3 Nginx作為負載均衡服務
- 1、配置語法與場景
- 2、參數講解
- 3、backup狀態演示
- 4、輪詢策略
- 3-4 Nginx作為緩存服務
- 1、緩存服務配置語法
- 2、場景配置演示.
- 3、分片請求
- 第四章 深度學習篇
- 4-1 Nginx動靜分離
- 4-2 Rewrite規則
- 1、配置語法
- 2、正則表達式
- 3、規則中的flag
- 4、redirect和permanent區別
- 5、規則場景
- 4-3 Nginx進階高級模塊
- 1、secure_link模塊作用原理
- 2、Geoip讀取地域信息模塊
- 4-4 基于Nginx的HTTPS服務
- 1、原理和作用
- 2、證書簽名生成CA證書.
- 3、實戰場景配置蘋果要求的openssl
- 4、HTTPS服務優化
- 4-5 Nginx與Lua的開發
- 1、Nginx與Lua特性與優勢
- 2、Lua基礎開發語法
- 3、Lua的指令及api接口
- 4、實戰場景灰度發布
- 第五章 Nginx架構篇
- 安全
- 5-27 Nginx+LUA防火墻功能
- Nginx 錯誤專題
- 1、 Failed to parse PID from file
- 2、error: the HTTP gzip module requires the zlib library
- 3、open() “/usr/local/nginx/html/favicon.ico” failed (2: No such file or directory)
- Openresty
- 控制命令