優(yōu)化Linux文件打開最大數(shù)
-
為了防止失控的進程破壞系統(tǒng)的性能,UNIX和Linux會跟蹤進程使用的大部分資源,并允許用戶和系統(tǒng)管理員使用對進程的資源限制,例如控制某個進程打開的文件數(shù)扳碍、對某個用戶打開系統(tǒng)進程數(shù)進行限制等,一般限制手段包括軟限制和硬限制
- 軟限制(soft limit):內(nèi)核實際執(zhí)行的限制,任何進程都可以將軟限制設(shè)置為任意小于或等于對進程限制的硬限制的值戴质、最大線程數(shù)(noproc)和文件數(shù)(nofile)
- 硬限制(hard limit):可以在任何時候任何進程中設(shè)置,但硬限制只能由超級用戶修改
Linux系統(tǒng)一切皆文件,對Linux進行各種操作,實際就是對文件進行操作,文件可分為普通文件鳍侣、目錄文件、鏈接文件和設(shè)備文件.而文件描述符(file descriptor)是內(nèi)核為了高效管理已被打開的文件所創(chuàng)建的索引,其值是一個非負(fù)整數(shù)(通常是小正數(shù)),用于指代被打開的文件,所有執(zhí)行I/O操作的系統(tǒng)調(diào)用都通過文件描述符
Linux系統(tǒng)默認(rèn)已經(jīng)打開的文件描述符包括STDIN_FILENO 0表示標(biāo)準(zhǔn)輸入、STDOUT_FILENO 1表示標(biāo)準(zhǔn)輸出疫鹊、STDERR_FILENO 2表示標(biāo)準(zhǔn)錯誤輸出,默認(rèn)打開一個文件,它的文件描述符為3
每個文件描述符與一個打開文件相對應(yīng),不同的文件描述符可以指向同一個文件,相同的文件可以被不同的進程打開,也可以在同一進程中被多次打開
-
Linux系統(tǒng)為每個進程維護了一個文件描述符,該表的值都是從0開始,在不同的進程中用戶會看到相同的文件描述符,相同文件描述符有可能指向同一個文件,也可能指向不同的文件.Linux內(nèi)核對文件操作,維護了3個數(shù)據(jù)結(jié)構(gòu)概念:
- 進程級的文件描述符表
- 系統(tǒng)級的打開文件描述符表
- 文件系統(tǒng)的i-node表
-
其中進程級的描述符表的每一條目記錄了單個文件描述符的相關(guān)信息,例如控制文件描述符操作的一組標(biāo)志及對打開文件句柄的引用.Linux內(nèi)核對所有打開的文件都維護了一個系統(tǒng)級的描述符表(open file description table).將描述符表中的記錄行稱為打開文件句柄(open file handle),一個打開文件句柄存儲了一個打開文件相關(guān)的全部信息
- 當(dāng)前文件偏移量
- 打開文件時所使用的的狀態(tài)標(biāo)識
- 文件訪問模式
- 與信號驅(qū)動相關(guān)的設(shè)置
- 對該文件inode對象的引用
- 文件類型和訪問權(quán)限
- 指針指向該文件所持有的鎖列表
- 文件的各種屬性
-
默認(rèn)Linux內(nèi)核對每個用戶設(shè)置了打開文件最大數(shù)為1024,對于高并發(fā)網(wǎng)站,是遠(yuǎn)遠(yuǎn)不夠的,需要將默認(rèn)值調(diào)整到更大,方法如下:
- Linux每個用戶打開文件最大數(shù)臨時設(shè)置方法,重啟服務(wù)器該參數(shù)無效
unlimit -n 65535
- Linux每個用戶打開文件最大數(shù)永久設(shè)置方法,修改/etc/security/limits.conf,在末尾修改以下內(nèi)容
* soft noproc 65535 * hard noproc 65535 * soft nofile 65535 * hard nofile 65535
- 上述設(shè)置為對每個用戶分別設(shè)置nofile、noproc最大數(shù),如果需要對Linnx整個系統(tǒng)設(shè)置文件最大限制數(shù),需修改/proc/sys/fs/file-max中的值,該值為Linux總文件打開數(shù).例如設(shè)置為3865161233
內(nèi)核參數(shù)的優(yōu)化
- Linux /proc/sys目錄下存放著多數(shù)內(nèi)核的參數(shù),并且可以在系統(tǒng)運行時進行更改,一般重新啟動機器就會失效.而/etc/sysctl.conf是一個允許改變正在運行中的Linux系統(tǒng)的接口,它包含一些TCP/IP堆棧和虛擬內(nèi)存系統(tǒng)的高級選項,修改內(nèi)核參數(shù)永久生效
- /proc/sys下內(nèi)核文件與配置文件sysctl.conf中變量存在著對應(yīng)關(guān)系,即修改sysctl.conf配置文件,實際是修改/proc/sys相關(guān)參數(shù),所以對Linux內(nèi)核優(yōu)化只需修改/etc/sysctl.conf文件即可
影響服務(wù)器性能因素
-
影響生產(chǎn)環(huán)境Linux服務(wù)器性能的因素有很多,一般分為兩大類,即操作系統(tǒng)層級和應(yīng)用程序級別.以下為各級別影響性能的具體項及性能評估的標(biāo)準(zhǔn)
- 操作系統(tǒng)級別
- 內(nèi)存
- CPU
- 磁盤I/O
- 網(wǎng)絡(luò)I/O帶寬
- 應(yīng)用程序及軟件
- Nginx
- MySQL
- Tomcat
- PHP
- Linux系統(tǒng)性能評估表
影響性能因素 評判標(biāo)準(zhǔn) 好 壞 糟糕 CPU user%+sys% < 70% user%+sys% = 85% user%+sys% >= 90% 內(nèi)存 Swap In(si)=0 Swap Out(so)=0 Per CPU with 10 page/s More Swap In & Swap Out 磁盤 iowait% < 20% iowait% = 35% iowait% >= 50% - Linux系統(tǒng)性能分析工具
- 常用系統(tǒng)性能分析命令為vmstat、sar惧浴、iostat、netstat奕剃、free衷旅、ps、top纵朋、iftop等
- 常用系統(tǒng)性能組合命令:
- vmstat柿顶、sar、iostat:檢測是否是CPU瓶頸
- free操软、vmstat:檢測是否是內(nèi)存瓶頸
- iostat:檢測是否是磁盤I/O瓶頸
- netstat嘁锯、iftop:檢測是否是網(wǎng)絡(luò)帶寬瓶頸
- 操作系統(tǒng)級別
Linux服務(wù)器性能評估與優(yōu)化
-
Linux服務(wù)器性能評估與優(yōu)化是一項長期的工作,需要隨時關(guān)注網(wǎng)站服務(wù)器的運行狀態(tài),及時作出相應(yīng)的調(diào)整
-
Linux系統(tǒng)整體性能評估
- uptime命令主要用于查看當(dāng)前服務(wù)器整體性能,例如CPU、負(fù)載、內(nèi)存等值的總覽,以下為uptime詳解
uptime 21:51:02 up 13:24, 1 user, load average: 0.00, 0.01, 0.05
- load average負(fù)載有3個值,分別表示最近1min家乘、5min蝗羊、15min系統(tǒng)的負(fù)載,3個值的大小一般不能大于系統(tǒng)邏輯CPU核數(shù)的2倍,例如Linux操作系統(tǒng)有4個邏輯CPU,如果load average的3個值長期大于8時,說明CPU很繁忙,負(fù)載很高,可能會影響系統(tǒng)性能,但是偶爾大于8時,可以不用擔(dān)心,一般不會影響系統(tǒng)性能
- 如果load average的輸出裝小于CPU邏輯個數(shù)的2倍,則表示CPU還有空閑的時間片.基于此參數(shù)不能完全確認(rèn)服務(wù)器的性能瓶頸,需要借助其他工具判斷
-
CPU性能評估
- 利用vmstat命令監(jiān)控CPU,該命令可以顯示關(guān)于系統(tǒng)各種資源之間相關(guān)性能的簡要信息,主要用它來查看CPU負(fù)載及隊列情況
vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 625548 2148 761888 0 0 7 17 28 74 0 0 100 0 0
r:該列表示運行和等待CPU時間片的進程數(shù),這個值如果長期大于系統(tǒng)CPU的個數(shù),說明CPU不足,需要增加CPU
b:該列表示在等待資源的進程數(shù),比如正在等待I/O或者內(nèi)存交換
us:該列顯示了用戶進程消耗的CPU時間百分比,us的值比較高時,說明用戶進程消耗的CPU時間多,但是如果長期大于50%,就需要考慮優(yōu)化程序或算法
sy:該列顯示了內(nèi)核進程消耗的CPU時間百分比,sy的值較高時,說明內(nèi)核消耗的CPU資源很多
us+sy:參考值為80%,如果us+sy大于80%說明可能存在CPU資源不足
利用sar命令監(jiān)控系統(tǒng)CPU,sar功能很強大,可以對系統(tǒng)的每個方面進行單獨的統(tǒng)計,但是使用sar命令會增加系統(tǒng)開銷,不過這些開銷是可以評估的,對系統(tǒng)的統(tǒng)計結(jié)果不會有很大影響
sar -u 2 10 Linux 3.10.0-957.el7.x86_64 (orange) 03/24/2020 _x86_64_ (1 CPU) 10:10:42 PM CPU %user %nice %system %iowait %steal %idle 10:10:44 PM all 0.00 0.00 0.50 0.00 0.00 99.50 10:10:46 PM all 0.00 0.00 0.00 0.00 0.00 100.00 10:10:48 PM all 0.00 0.00 0.00 0.00 0.00 100.00 10:10:50 PM all 0.00 0.00 0.00 0.00 0.00 100.00 10:10:52 PM all 0.00 0.00 0.00 0.00 0.00 100.00 10:10:54 PM all 0.00 0.00 0.50 0.00 0.00 99.50 10:10:56 PM all 0.00 0.00 0.00 0.00 0.00 100.00 10:10:58 PM all 0.00 0.00 0.00 0.00 0.00 100.00 10:11:00 PM all 0.50 0.00 2.49 0.00 0.00 97.01 10:11:02 PM all 0.00 0.00 1.51 0.00 0.00 98.49 Average: all 0.05 0.00 0.50 0.00 0.00 99.45
- 輸出結(jié)果詳解:
- %user:該列顯示用戶進程消耗的CPU時間百分比
- %nice:該列顯示了運行正常進程所消耗的CPU時間百分比
- %system:該列顯示了系統(tǒng)進程消耗的CPU時間百分比
- %iowait:該列顯示了I/O等待所占用的CPU時間百分比
- %steal:該列顯示了CPU處在空閑狀態(tài)的時間百分比
- %idle:該列顯示了在內(nèi)存相對緊張的環(huán)境下pagein強制對不同頁面進行的steal操作
-
內(nèi)存性能評估
- 利用free指令監(jiān)控內(nèi)存,free是監(jiān)控Linux內(nèi)存使用狀況最常用的指令
free -m total used free shared buff/cache available Mem: 1980 624 419 9 936 1163 Swap: 2047 0 2047
- 一般而言,服務(wù)器內(nèi)存可以通過以下方法判斷是否空余
- 應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存大于70%時,表示系統(tǒng)內(nèi)存資源非常充足,不影響系統(tǒng)性能
- 應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存小于20%時,表示系統(tǒng)內(nèi)存資源緊缺,需要增加系統(tǒng)內(nèi)存
- 20%<應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存<70%時,表示系統(tǒng)內(nèi)存資源基本能滿足應(yīng)用需求,暫時不影響系統(tǒng)性能
-
磁盤I/O性能評估
- 利用iostat評估磁盤性能,監(jiān)控磁盤I/O讀寫及帶寬
iostat -d 1 10 Linux 3.10.0-957.el7.x86_64 (orange) 03/24/2020 _x86_64_ (1 CPU) Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn scd0 0.00 0.11 0.00 5476 0 sda 0.29 7.09 20.92 354986 1046959 dm-0 0.29 6.74 20.84 337211 1042843 dm-1 0.00 0.05 0.00 2460 0 dm-2 0.00 0.10 0.04 5160 2048 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn scd0 0.00 0.00 0.00 0 0 sda 0.00 0.00 0.00 0 0 dm-0 0.00 0.00 0.00 0 0 dm-1 0.00 0.00 0.00 0 0 dm-2 0.00 0.00 0.00 0 0 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn scd0 0.00 0.00 0.00 0 0 sda 0.00 0.00 0.00 0 0 dm-0 0.00 0.00 0.00 0 0 dm-1 0.00 0.00 0.00 0 0 dm-2 0.00 0.00 0.00 0 0
- iostat輸出結(jié)果詳解:
- kB_read/s:表示每秒讀取的數(shù)據(jù)塊數(shù)
- kB_wrtn/s:表示每秒寫入的數(shù)據(jù)塊數(shù)
- kB_read:表示讀取的所有塊數(shù)
- kB_wrtn:表示寫入的所有塊數(shù)
- 可以通過kB_read/s和kB_wrtn/s的值對磁盤的讀寫性能有基本的了解,如果kB_wrtn/s值很大,表示磁盤的寫操作很頻繁,可以考慮優(yōu)化磁盤或者優(yōu)化程序,如果kB_read/s值很大,表示磁盤直接讀取操作很多,可以將讀取的數(shù)據(jù)放入內(nèi)存中進行操作
- 利用sar評估磁盤性能,通過sar -d可以對系統(tǒng)的磁盤I/O做基本的統(tǒng)計
sar -d 1 10 Linux 3.10.0-957.el7.x86_64 (orange) 03/24/2020 _x86_64_ (1 CPU) 10:29:20 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 10:29:21 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:29:21 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:29:21 PM dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:29:21 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:29:21 PM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:29:21 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 10:29:22 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:29:22 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:29:22 PM dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:29:22 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:29:22 PM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- sar輸出結(jié)果詳解
- await:表示平均每次設(shè)備I/O操作的等待時間(以ms為單位)
- svctm:表示平均每次設(shè)備I/O操作的服務(wù)時間(以ms為單位)
- %util:表示1秒內(nèi)有百分之幾的時間用于I/O操作
- 磁盤I/O性能,評判的標(biāo)準(zhǔn)為正常情況下svctm應(yīng)該是小于await的值,而svctm的大小和磁盤性能有關(guān),CPU、內(nèi)存的負(fù)荷也會對svctm值造成影響,過多的請求也會間接地導(dǎo)致svctm值的增加
- await的值大小一般取決于svctm的值和I/O隊列長度以及I/O請求模式,如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,如果await的值遠(yuǎn)高于svctm的值,則表示I/O隊列等待太長,系統(tǒng)上運行的應(yīng)用程序?qū)⒆兟?此時可通過更換更快的硬盤來解決問題
- %util項的值也是衡量磁盤I/O的一個重要指標(biāo),如果%util接近100%,表示磁盤產(chǎn)生的I/O請求太多,I/O系統(tǒng)已經(jīng)滿負(fù)荷的在工作,該磁盤可能存在瓶頸.長期下去,勢必影響系統(tǒng)的性能,可以通過優(yōu)化程序或者通過更換更高仁锯、更快的磁盤來解決此問題
-
網(wǎng)絡(luò)性能評估
- 通過ping命令檢查網(wǎng)絡(luò)的連通性
- 通過netstat -i組合檢測網(wǎng)絡(luò)接口狀況
- 通過netstat -r組合檢測系統(tǒng)的路由表信息
- 通過sar -n組合顯示系統(tǒng)的網(wǎng)絡(luò)運行狀態(tài)通過
- iftop -i ens32可以查看網(wǎng)卡流量
-
- iftop -i ens32詳細(xì)參數(shù):
- <=:客戶端流入的流量
- =>:服務(wù)端流出的流量
- TX:發(fā)送流量
- RX:接收流量
- TOTAL:總流量
- cum:運行iftop到目前時間的總流量
- peak:流量峰值
- rates:分別表示過去2s耀找、10s、40s的平均流量