前言
這裏說的“瑞士軍刀”是指那些簡單的一句命令就能完成其它高級語言一大片代碼才能完成的工作。
- Jul 23 Thu 2015 14:17
Linux命令行裏的“瑞士軍刀”
- Jul 22 Wed 2015 17:31
strace工具診斷Linux問題
引言
- Jul 21 Tue 2015 13:45
Linux程序內存空間布局
前言:
在偏底層的開發中,需要了解程序的是如何存儲的。
- Jul 20 Mon 2015 12:35
Linux流量監控工具iftop
http://blog.udn.com/q928856957/26147804
在類Unix系統中可以使用top查看系統資源、進程、內存占用等信息。查看網絡狀態可以使用netstat、nmap等工具。若要查看實時的網絡流量,監控TCP/IP連接等,則可以使用iftop。
- Jul 18 Sat 2015 23:19
Linux之LVM理論及實現
DM:Device Mapper 也可以將多個物理設備映射成一個邏輯設備
功能:
- Jul 17 Fri 2015 16:33
linux下監控進程對帶寬的占用
应用场景描述:
如果你发现网络较慢, 经查是出口带宽流量较大, 继续查是网内某台linux服务器的对外流量比较大, 然后采取措施, 对该linux服务器限速或者暂时性关闭网络. 但问题是, 这台服务器怎么了? 是中毒了, 还是用户访问量过大? 等你限速后, 再到服务器上查询原因, 基本上是查不到了, 各个进程占用率都正常了, 无法看到故障时的状态. 换句话说, 你无法通过本次故障, 避免同类故障再次发生.
- Jul 16 Thu 2015 12:57
用fsck檢查和修復Linux文件系統
使用fsck -p -C /backup/hardisk/test.fs檢查test.fs,檢查到42%時終止並打印錯誤:
- Jul 15 Wed 2015 17:53
linux基礎正則表達式(基於grep)
linux正則表達式: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 使用正則表達式註意事項: 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。(註意:為了使下面的案例更加清晰明了,在做下面的案例前請先執行此行命令) 3.註意字符集,LC_ALL=C linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) 1.^a 表示搜索以a開頭的內容 2.a$ 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. . 代表且只能代表任意一個字符 5. \ \. 就只代表點本身,轉義符號,讓有著特殊身份意義的字符,脫掉馬甲, 6. * 重復0個或多個前面的一個字符 7. .* 匹配所有字符。^.*以任意多個字符開頭,.*$以任意多個字符結尾 ^.* 根據前面的單個字符,我們知道^.*匹配以任意多個字符串開頭的內容。 8. [abc] 匹配字符集合內的任意一個字符[a-z]. 9. [^abc] 匹配不包含^後的任意字符的內容 [^a-z] 不包含小寫字母 [^0-9] 不包含數字 10. a\{n,m\} 重復n到m次,前一個重復的字符。如果用egrep可以取掉斜線。 \{n,\} 重復至少n次,前一個重復的字符。如果用egrep可以取掉斜線。 \{n\} 重復n次,前一個重復的字符。如果用egrep可以取掉斜線。 \{,m}\ 重復最多m次-最好不要用。 [root@nginx_back ~]# grep ".*" test.log《==匹配0個或多個,所以有空行。 linux正則表達式: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 使用正則表達式註意事項: 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) 1.^a 表示搜索以a開頭的內容 2.$a 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. [root@nginx_back ~]# grep "." test.log《==匹配任意一個字符,至少一個,所以沒有空行。 linux正則表達式: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 使用正則表達式註意事項: 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) 1.^a 表示搜索以a開頭的內容 2.$a 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. [root@nginx_back ~]# grep -v "^$" test.log linux正則表達式: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 使用正則表達式註意事項: 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) 1.^a 表示搜索以a開頭的內容 2.$a 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. [root@nginx_back ~]# grep -vn "^$" test.log 1:linux正則表達式: 2: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 3:使用正則表達式註意事項: 4:1.linux正則一般是以行為單位處理的。 5:2.alias grep='grep --color=auto',講課是以grep為例。 6:3.註意字符集,LC_ALL=C 7:linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 10:a、基礎正則表達式(基於grep) 11: 1.^a 表示搜索以a開頭的內容 12: 2.$a 表示搜索以a結尾的內容 13: 3.^$ 表示空行,不是空格 14: 4. [root@nginx_back ~]# grep -v n "^$" test.log grep: ^$: 沒有那個文件或目錄 test.log: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 test.log:使用正則表達式註意事項: test.log:2.alias grep='grep --color=auto',講課是以grep為例。 test.log:3.註意字符集,LC_ALL=C test.log: test.log: test.log:a、基礎正則表達式(基於grep) test.log: 1.^a 表示搜索以a開頭的內容 test.log: 2.$a 表示搜索以a結尾的內容 test.log: 3.^$ 表示空行,不是空格 test.log: 4. [root@nginx_back ~]# grep -v -n "^$" test.log 1:linux正則表達式: 2: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 3:使用正則表達式註意事項: 4:1.linux正則一般是以行為單位處理的。 5:2.alias grep='grep --color=auto',講課是以grep為例。 6:3.註意字符集,LC_ALL=C 7:linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 10:a、基礎正則表達式(基於grep) 11: 1.^a 表示搜索以a開頭的內容 12: 2.$a 表示搜索以a結尾的內容 13: 3.^$ 表示空行,不是空格 14: 4. [root@nginx_back ~]# grep "$" test.log linux正則表達式: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 使用正則表達式註意事項: 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) 1.^a 表示搜索以a開頭的內容 2.$a 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. [root@nginx_back ~]# grep "C$" test.log 3.註意字符集,LC_ALL=C [root@nginx_back ~]# grep "." test.log linux正則表達式: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 使用正則表達式註意事項: 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) 1.^a 表示搜索以a開頭的內容 2.$a 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. [root@nginx_back ~]# grep "\." test.log 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C 1.^a 表示搜索以a開頭的內容 2.$a 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. [root@nginx_back ~]# grep "rep" test.log 2.alias grep='grep --color=auto',講課是以grep為例。 linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) [root@nginx_back ~]# grep "grep" test.log 2.alias grep='grep --color=auto',講課是以grep為例。 linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) [root@nginx_back ~]# grep ".$" test.log linux正則表達式: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 使用正則表達式註意事項: 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) 1.^a 表示搜索以a開頭的內容 2.$a 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. [root@nginx_back ~]# grep "\.$" test.log 4. [root@nginx_back ~]# grep "\.*$" test.log linux正則表達式: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 使用正則表達式註意事項: 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C [root@nginx_back ~]# grep ".*" test.log linux正則表達式: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 使用正則表達式註意事項: 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) 1.^a 表示搜索以a開頭的內容 2.$a 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. [root@nginx_back ~]# grep "." test.log linux正則表達式: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 使用正則表達式註意事項: 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) 1.^a 表示搜索以a開頭的內容 2.$a 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. [root@nginx_back ~]# grep ".$" test.log linux正則表達式: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 使用正則表達式註意事項: 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) 1.^a 表示搜索以a開頭的內容 2.$a 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. [root@nginx_back ~]# grep ".*$" test.log linux正則表達式: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 使用正則表達式註意事項: 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) 1.^a 表示搜索以a開頭的內容 2.$a 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. [root@nginx_back ~]# grep "\.*" test.log linux正則表達式: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 使用正則表達式註意事項: 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) 1.^a 表示搜索以a開頭的內容 2.$a 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. [root@nginx_back ~]# grep "grep" test.log 2.alias grep='grep --color=auto',講課是以grep為例。 linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 a、基礎正則表達式(基於grep) [root@nginx_back ~]# grep "\." test.log 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 1.linux正則一般是以行為單位處理的。 2.alias grep='grep --color=auto',講課是以grep為例。 3.註意字符集,LC_ALL=C 1.^a 表示搜索以a開頭的內容 2.$a 表示搜索以a結尾的內容 3.^$ 表示空行,不是空格 4. [root@nginx_back ~]# grep "C$" test.log 3.註意字符集,LC_ALL=C [root@nginx_back ~]# grep -v -n "^$" test.log 1:linux正則表達式: 2: 簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法,如:假設@代表123456,!代表abcde.通過定義的這些特殊符號的鋪助,系統管理員就可以快速的過濾,替換或輸出需要的字符。 3:使用正則表達式註意事項: 4:1.linux正則一般是以行為單位處理的。 5:2.alias grep='grep --color=auto',講課是以grep為例。 6:3.註意字符集,LC_ALL=C 7:linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。 10:a、基礎正則表達式(基於grep) 11: 1.^a 表示搜索以a開頭的內容 12: 2.$a 表示搜索以a結尾的內容 13: 3.^$ 表示空行,不是空格 14: 4. [root@nginx_back ~]# grep "^linux" test.log linux正則表達式: linux裏正則表達式。主要是awk、sed、grep(egrep)三劍客的正則表達式。、 [root@nginx_back ~]# cat test.log [aaa] cfg1=aaa xxxx=bbb cfg2=ccc cfg3=ddd [bbb] cfg1=eee yyyy=fff cfg2=ggg cfg3=hhh cfg4=iii [ccc] cfg1=jjj zzzz=kkk cfg2=lll cfg2=mmm cfg2=nnn [root@nginx_back ~]# grep "c*" test.log [aaa] cfg1=aaa xxxx=bbb cfg2=ccc cfg3=ddd [bbb] cfg1=eee yyyy=fff cfg2=ggg cfg3=hhh cfg4=iii [ccc] cfg1=jjj zzzz=kkk cfg2=lll cfg2=mmm cfg2=nnn [root@nginx_back ~]# grep -o "c*" test.log c c ccc c c c c c ccc c c c c [root@nginx_back ~]# grep -o ".*" test.log [aaa] cfg1=aaa xxxx=bbb cfg2=ccc cfg3=ddd [bbb] cfg1=eee yyyy=fff cfg2=ggg cfg3=hhh cfg4=iii [ccc] cfg1=jjj zzzz=kkk cfg2=lll cfg2=mmm cfg2=nnn [root@nginx_back ~]# alias grep='grep --color=auto' [root@nginx_back ~]# grep "c*" test.log [aaa] cfg1=aaa xxxx=bbb cfg2=ccc cfg3=ddd [bbb] cfg1=eee yyyy=fff cfg2=ggg cfg3=hhh cfg4=iii [ccc] cfg1=jjj zzzz=kkk cfg2=lll cfg2=mmm cfg2=nnn [root@nginx_back ~]# grep -o "c*" test.log c c ccc c c c c c ccc c c c c [root@nginx_back ~]# grep -o ".*" test.log [aaa] cfg1=aaa xxxx=bbb cfg2=ccc cfg3=ddd [bbb] cfg1=eee yyyy=fff cfg2=ggg cfg3=hhh cfg4=iii [ccc] cfg1=jjj zzzz=kkk cfg2=lll cfg2=mmm cfg2=nnn [root@nginx_back ~]# grep "[abc]" test.log [aaa] cfg1=aaa xxxx=bbb cfg2=ccc cfg3=ddd [bbb] cfg1=eee cfg2=ggg cfg3=hhh cfg4=iii [ccc] cfg1=jjj cfg2=lll cfg2=mmm cfg2=nnn [root@nginx_back ~]# grep "[a-z]" test.log [aaa] cfg1=aaa xxxx=bbb cfg2=ccc cfg3=ddd [bbb] cfg1=eee yyyy=fff cfg2=ggg cfg3=hhh cfg4=iii [ccc] cfg1=jjj zzzz=kkk cfg2=lll cfg2=mmm cfg2=nnn [root@nginx_back ~]# grep "[0-9]" test.log cfg1=aaa cfg2=ccc cfg3=ddd cfg1=eee cfg2=ggg cfg3=hhh cfg4=iii cfg1=jjj cfg2=lll cfg2=mmm cfg2=nnn [root@nginx_back ~]# vi test.log [aaa] cfg1=aaa .xxxx=bbb cfg2=ccc .cfg3=ddd [bbb] cfg1=eee .yyyy=fff/ cfg2=ggg cfg3=hhh c.fg4=iii/ [ccc] cf.g1=jjj zzzz=kkk/ cfg.2=lll. "test.log" 17L, 154C written [root@nginx_back ~]# grep "[\.,/]" test.log .xxxx=bbb .cfg3=ddd .yyyy=fff/ c.fg4=iii/ cf.g1=jjj zzzz=kkk/ cfg.2=lll. [root@nginx_back ~]# grep "[^abc]" test.log [aaa] cfg1=aaa .xxxx=bbb cfg2=ccc .cfg3=ddd [bbb] cfg1=eee .yyyy=fff/ cfg2=ggg cfg3=hhh c.fg4=iii/ [ccc] cf.g1=jjj zzzz=kkk/ cfg.2=lll. cfg2=mmm cfg2=nnn [root@nginx_back ~]# vi test.log [aaa] cfg1=aaa00000 0.xxxx=bbb cfg2=ccc .00cfg3=ddd [bbb]0000 cfg1=eee .yy00yy=fff/ cfg2=ggg cfg3=hhh00000 c.fg400=iii/ [ccc] cf.g1=jjj zzzz=kk000000000k/ cfg.2=lll. cfg2=mmm cfg2=nnn "test.log" 17L, 184C written [root@nginx_back ~]# grep "0\{1,3\}" test.log cfg1=aaa00000 0.xxxx=bbb .00cfg3=ddd [bbb]0000 .yy00yy=fff/ cfg3=hhh00000 c.fg400=iii/ zzzz=kk000000000k/ [root@nginx_back ~]# grep "0\{1,\}" test.log cfg1=aaa00000 0.xxxx=bbb .00cfg3=ddd [bbb]0000 .yy00yy=fff/ cfg3=hhh00000 c.fg400=iii/ zzzz=kk000000000k/ [root@nginx_back ~]# grep "0\{2\}" test.log cfg1=aaa00000 .00cfg3=ddd [bbb]0000 .yy00yy=fff/ cfg3=hhh00000 c.fg400=iii/ zzzz=kk000000000k/ [root@nginx_back ~]# egrep "0{1,3}" test.log cfg1=aaa00000 0.xxxx=bbb .00cfg3=ddd [bbb]0000 .yy00yy=fff/ cfg3=hhh00000 c.fg400=iii/ zzzz=kk000000000k/ grep一般常用參數: -a: 在二進制文件中,以文本文件的方式搜索數據 -c: 計算找到‘搜索字符串’的次數 -o: 僅顯示出匹配regexp的內容(用於統計出現在文中的次數) -i: 忽略大小寫的不同,所以大小寫視為相同 -n: 在行首顯示行號 -v: 反向選擇,即顯示沒有‘搜索字符串’內容的那一行 -E: 擴展的grep,即egrep --color=auto: 以特定顏色高亮顯示匹配關鍵字 #<-提示:-i -v 為常用參數 -A: After的意思,顯示匹配字符串後n行的數據 -B: before的意思,顯示匹配字符串前n行的數據
- Jul 14 Tue 2015 15:30
減小Linux內存cache
vi /etc/sysctl.conf
- Jul 13 Mon 2015 17:38
配置支持高並發TCP連接的Linux服務器
http://9988365.blogspot.hk/2015/07/tcplinux.html
1、修改用戶進程可打開文件數限制 在Linux平臺上,無論編寫客戶端程序還是服務端程序,在 進行高並發TCP連接處理時,最高的並發數量都要受到系統對用戶單一進程同時可打開文件數量 的限制(這是因為系統為每個TCP連接都要創建一個socket句柄,每個socket句柄同時也是一個文件句柄)。可使用ulimit命令查看系統允許 當前用戶進程打開的文件數限制: [speng@as4 ~]$ ulimit -n 1024 這表示當前用戶的每個進程最多允許 同時打開1024個文件,這1024個文件中還得除去每個進程必然打開的標準輸入,標準輸出,標準錯誤,服務器監聽 socket,進程間通訊的unix域socket等文件,那麽剩下的可用於客戶端socket連接的文件數就只有大概1024-10=1014個左右。 也就是說缺省情況下,基於Linux的通訊程序最多允許同時1014個TCP並發連接。 對於想支持更高數量的TCP並發連接的通訊處理程序,就必須修改Linux對當前用戶的進程同時打開的文件數量的軟限制(soft limit)和硬限制(hardlimit)。其中軟限制是指Linux在當前系統能夠承受的範圍內進一步限制用戶同時打開的文件數;硬限制則是根據系統 硬件資源狀況(主要是系統內存)計算出來的系統最多可同時打開的文件數量。通常軟限制小於或等於硬限制。 修改上述限制的最簡單的辦法就是使用ulimit命令: [speng@as4 ~]$ ulimit -n 上述命令中,在中指定 要設置的單一進程允許打開的最大文件數。如果系統回顯類似於“Operation notpermitted”之類的話,說明上述限制修改失敗,實際上是因為在中指定的數值超過了Linux系統對該用戶 打開文件數的軟限制或硬限制。因此,就需要修改Linux系統對用戶的關於打開文件數的軟限制和硬限制。 第一步,修改/etc/security/limits.conf文件,在文件中添加如下行: speng soft nofile 10240 speng hard nofile 10240 其中speng指定了要修改哪個用戶的打開文件數限制,可用'*'號表示修改所有用戶的限制;soft或hard指定要修改軟限制還是硬限制;10240則指定了想要修改的新的限制值,即最大打開文件數(請註意軟限制值要小於或等於硬限制)。修改完後保存文件。 第二步,修改/etc/pam.d/login文件,在文件中添加如下行: session required /lib/security/pam_limits.so 這 是告訴Linux在用戶完成系統登錄後,應該調用pam_limits.so模塊來設置系統對該用戶可使用的各種資源數量的最大限制(包括用戶可打開 的最大文件數限制),而pam_limits.so模塊就會從/etc/security/limits.conf文件中讀取配置來設置這些限制值。修改 完後保存此文件。 第三步,查看Linux系統級的最大打開文件數限制,使用如下命令: [speng@as4 ~]$ cat /proc/sys/fs/file-max 12158 這 表明這臺Linux系統最多允許同時打開(即包含所有用戶打開文件數總和)12158個文件,是Linux系統級硬限制,所有用戶級的打開文件數限制 都不應超過這個數值。通常這個系統級硬限制是Linux系統在啟動時根據系統硬件資源狀況計算出來的最佳的最大同時打開文件數限制,如果沒有特殊需要,不 應該修改此限制,除非想為用戶級打開文件數限制設置超過此限制的值。修改此硬限制的方法是修改/etc/rc.local腳本,在腳本中添加如下行: echo 22158 > /proc/sys/fs/file-max 這是讓Linux在啟動完成後強行將系統級打開文件數硬限制設置為22158。修改完後保存此文件。 完成上述步驟後重啟系統,一般情況下就可以將Linux系統對指定用戶的單一進程允許同時打開的最大文件數限制設為指定的數值。如果重啟後用 ulimit-n命令查看用戶可打開文件數限制仍然低於上述步驟中設置的最大值,這可能是因為在用戶登錄腳本/etc/profile中使用ulimit -n命令已經將用戶可同時打開的文件數做了限制。由於通過ulimit-n修改系統對用戶可同時打開文件的最大數限制時,新修改的值只能小於或等於上次 ulimit-n設置的值,因此想用此命令增大這個限制值是不可能的。所以,如果有上述問題存在,就只能去打開/etc/profile腳本文件,在文件 中查找是否使用了ulimit-n限制了用戶可同時打開的最大文件數量,如果找到,則刪除這行命令,或者將其設置的值改為合適的值,然後保存文件,用戶退 出並重新登錄系統即可。 通過上述步驟,就為支持高並發TCP連接處理的通訊處理程序解除關於打開文件數量方面的系統限制。 2、修改網絡內核對TCP連接的有關限制 在Linux上編寫支持高並發TCP連接的客戶端通訊處理程序時,有時會發現盡管已經解除了系統對用戶同時打開文件數的限制,但仍會出現並發TCP連接數增加到一定數量時,再也無法成功建立新的TCP連接的現象。出現這種現在的原因有多種。 第一種原因可能是因為Linux網絡內核對本地端口號範圍有限制。此時,進一步分析為什麽無法建立TCP連接,會發現問題出在connect()調 用返 回失敗,查看系統錯誤提示消息是“Can't assign requestedaddress”。同時,如果在此時用tcpdump工具監視網絡,會發現根本沒有TCP連接時客戶端發SYN包的網絡流量。這些情況 說明問題在於本地Linux系統內核中有限制。其實,問題的根本原因在於Linux內核的TCP/IP協議實現模塊對系統中所有的客戶端TCP連接對應的 本地端口號的範圍進行了限制(例如,內核限制本地端口號的範圍為1024~32768之間)。當系統中某一時刻同時存在太多的TCP客戶端連接時,由於每 個TCP客戶端連接都要占用一個唯一的本地端口號(此端口號在系統的本地端口號範圍限制中),如果現有的TCP客戶端連接已將所有的本地端口號占滿,則此 時就無法為新的TCP客戶端連接分配一個本地端口號了,因此系統會在這種情況下在connect()調用中返回失敗,並將錯誤提示消息設為“Can't assignrequested address”。有關這些控制邏輯可以查看Linux內核源代碼,以linux2.6內核為例,可以查看tcp_ipv4.c文件中如下函數: static int tcp_v4_hash_connect(struct sock *sk) 請註意上述函數中對變量sysctl_local_port_range的訪問控制。變量sysctl_local_port_range的初始化則是在tcp.c文件中的如下函數中設置: void __init tcp_init(void) 內核編譯時默認設置的本地端口號範圍可能太小,因此需要修改此本地端口範圍限制。 第一步,修改/etc/sysctl.conf文件,在文件中添加如下行: net.ipv4.ip_local_port_range = 1024 65000 這表明將系統對本地端口範圍限制設置為1024~65000之間。請註意,本地端口範圍的最小值必須大於或等於1024;而端口範圍的最大值則應小於或等於65535。修改完後保存此文件。 第二步,執行sysctl命令: [speng@as4 ~]$ sysctl -p 如果系統沒有錯誤提示,就表明新的本地端口範圍設置成功。如果按上述端口範圍進行設置,則理論上單獨一個進程最多可以同時建立60000多個TCP客戶端連接。 第二種無法建立TCP連接的原因可能是因為Linux網絡內核的IP_TABLE防火墻對最大跟蹤的TCP連接數有限制。此時程序會表現為在 connect()調用中阻塞,如同死機,如果用tcpdump工具監視網絡,也會發現根本沒有TCP連接時客戶端發SYN包的網絡流量。由於 IP_TABLE防火墻在內核中會對每個TCP連接的狀態進行跟蹤,跟蹤信息將會放在位於內核內存中的conntrackdatabase中,這個數據庫 的大小有限,當系統中存在過多的TCP連接時,數據庫容量不足,IP_TABLE無法為新的TCP連接建立跟蹤信息,於是表現為在connect()調用 中阻塞。此時就必須修改內核對最大跟蹤的TCP連接數的限制,方法同修改內核對本地端口號範圍的限制是類似的: 第一步,修改/etc/sysctl.conf文件,在文件中添加如下行: net.ipv4.ip_conntrack_max = 10240 這表明將系統對最大跟蹤的TCP連接數限制設置為10240。請註意,此限制值要盡量小,以節省對內核內存的占用。 第二步,執行sysctl命令: [speng@as4 ~]$ sysctl -p 如果系統沒有錯誤提示,就表明系統對新的最大跟蹤的TCP連接數限制修改成功。如果按上述參數進行設置,則理論上單獨一個進程最多可以同時建立10000多個TCP客戶端連接。 3、使用支持高並發網絡I/O的編程技術 在Linux上編寫高並發TCP連接應用程序時,必須使用合適的網絡I/O技術和I/O事件分派機制。 可用的I/O技術有同步I/O,非阻塞式同步I/O(也稱反應式I/O),以及異步I/O。在高TCP並發的情形下,如果使用同步I/O,這會嚴重 阻塞 程序的運轉,除非為每個TCP連接的I/O創建一個線程。但是,過多的線程又會因系統對線程的調度造成巨大開銷。因此,在高TCP並發的情形下使用同步 I/O是不可取的,這時可以考慮使用非阻塞式同步I/O或異步I/O。非阻塞式同步I/O的技術包括使用select(),poll(),epoll等機 制。異步I/O的技術就是使用AIO。 從I/O事件分派機制來看,使用select()是不合適的,因為它所支持的並發連接數有限(通常在1024個以內)。如果考慮性能,poll() 也是 不合適的,盡管它可以支持的較高的TCP並發數,但是由於其采用“輪詢”機制,當並發數較高時,其運行效率相當低,並可能存在I/O事件分派不均,導致部 分TCP連接上的I/O出現“饑餓”現象。而如果使用epoll或AIO,則沒有上述問題(早期Linux內核的AIO技術實現是通過在內核中為每個 I/O請求創建一個線程來實現的,這種實現機制在高並發TCP連接的情形下使用其實也有嚴重的性能問題。但在最新的Linux內核中,AIO的實現已經得 到改進)。 綜上所述,在開發支持高並發TCP連接的Linux應用程序時,應盡量使用epoll或AIO技術來實現並發的TCP連接上的I/O控制,這將為提升程序對高並發TCP連接的支持提供有效的I/O保證。 Date: 2007-01-31 OS: Red Hat Enterprise Linux AS release 4 (kernel version 2.6.9-5.EL) 網上關於sysctl.conf的優化方案有各種版本,大多都是抄來抄去的,讓新人看了很迷茫。為解決此問題,經過兩天的整理,查了N多資料,將 大 家常用的總結如下,很多默認的不需要修改的暫未涉及,今後將逐步把所有的項目都有個翻譯、講解、修改建議,如有修改,將以此文為準,其他地方的內容,本人 不負責更新。 ################### 所有rfc相關的選項都是默認啟用的,因此網上的那些還自己寫rfc支持的都可以扔掉了:) ############################### net.inet.ip.sourceroute=0 net.inet.ip.accept_sourceroute=0 ############################# 通過源路由,攻擊者可以嘗試到達內部IP地址 --包括RFC1918中的地址,所以 不接受源路由信息包可以防止你的內部網絡被探測。 ################################# net.inet.tcp.drop_synfin=1 ################################### 安全參數,編譯內核的時候加了options TCP_DROP_SYNFIN才可以用,可以阻止某些OS探測。 ################################## kern.maxvnodes=8446 #################http://www.bsdlover.cn######### vnode 是對文件或目錄的一種內部表達。 因此, 增加可以被操作系統利用的 vnode 數量將降低磁盤的 I/O。 一般而言, 這是由操作系統自行完成的,也不需要加以修改。但在某些時候磁盤 I/O 會成為瓶頸, 而系統的 vnode 不足, 則這一配置應被增加。此時需要考慮是非活躍和空閑內存的數量。 要查看當前在用的 vnode 數量: # sysctl vfs.numvnodes vfs.numvnodes: 91349 要查看最大可用的 vnode 數量: # sysctl kern.maxvnodes kern.maxvnodes: 100000 如果當前的 vnode 用量接近最大值,則將 kern.maxvnodes 值增大 1,000 可能是個好主意。 您應繼續查看 vfs.numvnodes 的數值, 如果它再次攀升到接近最大值的程度, 仍需繼續提高 kern.maxvnodes。 在 top(1) 中顯示的內存用量應有顯著變化, 更多內存會處於活躍 (active) 狀態。 #################################### kern.maxproc: 964 #################http://www.bsdlover.cn######### Maximum number of processes #################################### kern.maxprocperuid: 867 #################http://www.bsdlover.cn######### Maximum processes allowed per userid #################################### 因為我的maxusers設置的是256,20+16*maxusers=4116。 maxprocperuid至少要比maxproc少1,因為init(8) 這個系統程序絕對要保持在運作狀態。 我給它設置的2068。 kern.maxfiles: 1928 #################http://www.bsdlover.cn######### 系統中支持最多同時開啟的文件數量,如果你在運行數據庫或大的很吃描述符的進程,那麽應該設置在20000以上, 比如kde這樣的桌面環境,它同時要用的文件非常多。 一般推薦設置為32768或者65536。 #################################### kern.argmax: 262144 #################http://www.bsdlover.cn######### maximum number of bytes (or characters) in an argument list. 命令行下最多支持的參數,比如你在用find命令來批量刪除一些文件的時候 find . -name "*.old" -delete,如果文件數超過了這個數字,那麽會提示你數字太多的。 可以利用find . -name "*.old" -ok rm {} \;來刪除。 默認的參數已經足夠多了,因此不建議再做修改。 #################################### kern.securelevel: -1 #################http://www.bsdlover.cn######### -1:這是系統默認級別,沒有提供任何內核的保護錯誤; 0:基本上作用不多,當你的系統剛啟動就是0級別的,當進入多用戶模式的時候就自動變成1級了。 1:在這個級別上,有如下幾個限制: a. 不能通過kldload或者kldunload加載或者卸載可加載內核模塊; b. 應用程序不能通過/dev/mem或者/dev/kmem直接寫內存; c. 不能直接往已經裝在(mounted)的磁盤寫東西,也就是不能格式化磁盤,但是可以通過標準的內核接口執行寫操作; d. 不能啟動X-windows,同時不能使用chflags來修改文件屬性; 2:在 1 級別的基礎上還不能寫沒裝載的磁盤,而且不能在1秒之內制造多次警告,這個是防止DoS控制臺的; 3:在 2 級別的級別上不允許修改IPFW防火墻的規則。 如果你已經裝了防火墻,並且把規則設好了,不輕易改動,那麽建議使用3級別,如果你沒有裝防火墻,而且還準備裝防火墻的話,不建議使用。 我們這裏推薦使用 2 級別,能夠避免比較多對內核攻擊。 #################################### kern.maxfilesperproc: 1735 #################http://www.bsdlover.cn######### 每個進程能夠同時打開的最大文件數量,網上很多資料寫的是32768 除非用異步I/O或大量線程,打開這麽多的文件恐怕是不太正常的。 我個人建議不做修改,保留默認。 #################################### kern.ipc.maxsockbuf: 262144 #################http://www.bsdlover.cn######### 最大的套接字緩沖區,網上有建議設置為2097152(2M)、8388608(8M)的。 我個人倒是建議不做修改,保持默認的256K即可,緩沖區大了可能造成碎片、阻塞或者丟包。 #################################### kern.ipc.somaxconn: 128 #################http://www.bsdlover.cn######### 最大的等待連接完成的套接字隊列大小,即並發連接數。 高負載服務器和受到Dos攻擊的系統也許會因為這個隊列被塞滿而不能提供正常服務。 默認為128,推薦在1024-4096之間,根據機器和實際情況需要改動,數字越大占用內存也越大。 #################################### kern.ipc.nmbclusters: 4800 #################http://www.bsdlover.cn######### 這個值用來調整系統在開機後所要分配給網絡 mbufs 的 cluster 數量, 由於每個 cluster 大小為 2K,所以當這個值為 1024 時,也是會用到 2MB 的核心內存空間。 假設我們的網頁同時約有 1000 個聯機,而 TCP 傳送及接收的暫存區大小都是 16K, 則最糟的情況下,我們會需要 (16K+16K) * 1024,也就是 32MB 的空間, 然而所需的 mbufs 大概是這個空間的二倍,也就是 64MB,所以所需的 cluster 數量為 64MB/2K,也就是 32768。 對於內存有限的機器,建議值是 1024 到 4096 之間,而當擁有海量存儲器空間時,我們可以將它設定為 4096 到 32768 之間。 我們可以使用 netstat 這個指令並加上參數 -m 來查看目前所使用的 mbufs 數量。 要修改這個值必須在一開機就修改,所以只能在 /boot/loader.conf 中加入修改的設定 kern.ipc.nmbclusters=32768 #################################### kern.ipc.shmmax: 33554432 #################http://www.bsdlover.cn######### 共享內存和信號燈("System VIPC")如果這些過小的話,有些大型的軟件將無法啟動 安裝xine和mplayer提示的設置為67108864,即64M, 如果內存多的話,可以設置為134217728,即128M #################################### kern.ipc.shmall: 8192 #################http://www.bsdlover.cn######### 共享內存和信號燈("System VIPC")如果這些過小的話,有些大型的軟件將無法啟動 安裝xine和mplayer提示的設置為32768 #################################### kern.ipc.shm_use_phys: 0 #################http://www.bsdlover.cn######### 如果我們將它設成 1,則所有 System V 共享內存 (share memory,一種程序間溝通的方式)部份都會被留在實體的內存 (physical memory) 中, 而不會被放到硬盤上的 swap 空間。我們知道物理內存的存取速度比硬盤快許多,而當物理內存空間不足時, 部份數據會被放到虛擬的內存上,從物理內存和虛擬內存之間移轉的動作就叫作 swap。如果時常做 swap 的動作, 則需要一直對硬盤作 I/O,速度會很慢。因此,如果我們有大量的程序 (數百個) 需要共同分享一個小的共享內存空間, 或者是共享內存空間很大時,我們可以將這個值打開。 這一項,我個人建議不做修改,除非你的內存非常大。 #################################### kern.ipc.shm_allow_removed: 0 #################http://www.bsdlover.cn######### 共享內存是否允許移除?這項似乎是在fb下裝vmware需要設置為1的,否則會有加載SVGA出錯的提示 作為服務器,這項不動也罷。 #################################### kern.ipc.numopensockets: 12 #################http://www.bsdlover.cn######### 已經開啟的socket數目,可以在最繁忙的時候看看它是多少,然後就可以知道maxsockets應該設置成多少了。 #################################### kern.ipc.maxsockets: 1928 #################http://www.bsdlover.cn######### 這是用來設定系統最大可以開啟的 socket 數目。如果您的服務器會提供大量的 FTP 服務, 而且常快速的傳輸一些小檔案,您也許會發現常傳輸到一半就中斷。因為 FTP 在傳輸檔案時, 每一個檔案都必須開啟一個 socket 來傳輸,但關閉 socket 需要一段時間,如果傳輸速度很快, 而檔案又多,則同一時間所開啟的 socket 會超過原本系統所許可的值,這時我們就必須把這個值調大一點。 除了 FTP 外,也許有其它網絡程序也會有這種問題。 然而,這個值必須在系統一開機就設定好,所以如果要修改這項設定,我們必須修改 /boot/loader.conf 才行 kern.ipc.maxsockets="16424" #################################### kern.ipc.nsfbufs: 1456 #################http://www.bsdlover.cn######### 經常使用 sendfile(2) 系統調用的繁忙的服務器, 有必要通過 NSFBUFS 內核選項或者在 /boot/loader.conf (查看 loader(8) 以獲得更多細節) 中設置它的值來調節 sendfile(2) 緩存數量。 這個參數需要調節的普通原因是在進程中看到 sfbufa 狀態。sysctl kern.ipc.nsfbufs 變量在內核配置變量中是只讀的。 這個參數是由 kern.maxusers 決定的,然而它可能有必要因此而調整。 在/boot/loader.conf裏加入 kern.ipc.nsfbufs="2496" #################################### kern.maxusers: 59 #################http://www.bsdlover.cn######### maxusers 的值決定了處理程序所容許的最大值,20+16*maxusers 就是你將得到的所容許處理程序。 系統一開機就必須要有 18 個處理程序 (process),即便是簡單的執行指令 man 又會產生 9 個 process, 所以將這個值設為 64 應該是一個合理的數目。 如果你的系統會出現 proc table full 的訊息的話,可以就把它設大一點,例如 128。 除非您的系統會需要同時開啟很多檔案,否則請不要設定超過 256。 可以在 /boot/loader.conf 中加入該選項的設定, kern.maxusers=256 #################################### kern.coredump: 1 #################http://www.bsdlover.cn######### 如果設置為0,則程序異常退出時不會生成core文件,作為服務器,不建議這樣。 #################################### kern.corefile: %N.core #################http://www.bsdlover.cn######### 可設置為kern.corefile="/data/coredump/%U-%P-%N.core" 其中 %U是UID,%P是進程ID,%N是進程名,當然/data/coredump必須是一個實際存在的目錄 #################################### vm.swap_idle_enabled: 0 vm.swap_idle_threshold1: 2 vm.swap_idle_threshold2: 10 ######################### 在有很多用戶進入、離開系統和有很多空閑進程的大的多用戶系統中很有用。 可以讓進程更快地進入內存,但它會吃掉更多的交換和磁盤帶寬。 系統默認的頁面調度算法已經很好了,最好不要更改。 ######################## vfs.ufs.dirhash_maxmem: 2097152 ######################### 默認的dirhash最大內存,默認2M 增加它有助於改善單目錄超過100K個文件時的反復讀目錄時的性能 建議修改為33554432(32M) ############################# vfs.vmiodirenable: 1 ################# 這個變量控制目錄是否被系統緩存。大多數目錄是小的,在系統中只使用單個片斷(典型的是1K)並且在緩存中使用的更小 (典型的是512字節)。 當這個變量設置為關閉 (0) 時,緩存器僅僅緩存固定數量的目錄,即使您有很大的內存。 而將其開啟 (設置為1) 時,則允許緩存器用 VM 頁面緩存來緩存這些目錄,讓所有可用內存來緩存目錄。 不利的是最小的用來緩存目錄的核心內存是大於 512 字節的物理頁面大小(通常是 4k)。 我們建議如果您在運行任何操作大量文件的程序時保持這個選項打開的默認值。 這些服務包括 web 緩存,大容量郵件系統和新聞系統。 盡管可能會浪費一些內存,但打開這個選項通常不會降低性能。但還是應該檢驗一下。 #################### vfs.hirunningspace: 1048576 ############################ 這個值決定了系統可以將多少數據放在寫入儲存設備的等候區。通常使用默認值即可, 但當我們有多顆硬盤時,我們可以將它調大為 4MB 或 5MB。 註意這個設置成很高的值(超過緩存器的寫極限)會導致壞的性能。 不要盲目的把它設置太高!高的數值會導致同時發生的讀操作的遲延。 ############################# vfs.write_behind: 1 ######################### 這個選項預設為 1,也就是打開的狀態。在打開時,在系統需要寫入數據在硬盤或其它儲存設備上時, 它會等到收集了一個 cluster 單位的數據後再一次寫入,否則會在一個暫存區空間有寫入需求時就立即寫到硬盤上。 這個選項打開時,對於一個大的連續的文件寫入速度非常有幫助。但如果您遇到有很多行程延滯在等待寫入動作時,您可能必須關閉這個功能。 ############################ net.local.stream.sendspace: 8192 ################################## 本地套接字連接的數據發送空間 建議設置為65536 ################################### net.local.stream.recvspace: 8192 ################################## 本地套接字連接的數據接收空間 建議設置為65536 ################################### net.inet.ip.portrange.lowfirst: 1023 net.inet.ip.portrange.lowlast: 600 net.inet.ip.portrange.first: 49152 net.inet.ip.portrange.last: 65535 net.inet.ip.portrange.hifirst: 49152 net.inet.ip.portrange.hilast: 65535 ################### 以上六項是用來控制TCP及UDP所使用的port範圍,這個範圍被分成三個部份,低範圍、預設範圍、及高範圍。 這些是你的服務器主動發起連接時的臨時端口的範圍,預設的已經1萬多了,一般的應用就足夠了。 如果是比較忙碌的FTP server,一般也不會同時提供給1萬多人訪問的, 當然如果很不幸,你的服務器就要提供很多,那麽可以修改first的值,比如直接用1024開始 ######################### net.inet.ip.redirect: 1 ######################### 設置為0,屏蔽ip重定向功能 ########################### net.inet.ip.rtexpire: 3600 net.inet.ip.rtminexpire: 10 ######################## 很多apache產生的CLOSE_WAIT狀態,這種狀態是等待客戶端關閉,但是客戶端那邊並沒有正常的關閉,於是留下很多這樣的東東。 建議都修改為2 ######################### net.inet.ip.intr_queue_maxlen: 50 ######################## Maximum size of the IP input queue,如果下面的net.inet.ip.intr_queue_drops一直在增加, 那就說明你的隊列空間不足了,那麽可以考慮增加該值。 ########################## net.inet.ip.intr_queue_drops: 0 #################### Number of packets dropped from the IP input queue,如果你sysctl它一直在增加, 那麽增加net.inet.ip.intr_queue_maxlen的值。 ####################### net.inet.ip.fastforwarding: 0 ############################# 如果打開的話每個目標地址一次轉發成功以後它的數據都將被記錄進路由表和arp數據表,節約路由的計算時間 但會需要大量的內核內存空間來保存路由表。 如果內存夠大,打開吧,呵呵 ############################# net.inet.ip.random_id: 0 ##################### 默認情況下,ip包的id號是連續的,而這些可能會被攻擊者利用,比如可以知道你nat後面帶了多少主機。 如果設置成1,則這個id號是隨機的,嘿嘿。 ##################### net.inet.icmp.maskrepl: 0 ############################ 防止廣播風暴,關閉其他廣播探測的響應。默認即是,無須修改。 ############################### net.inet.icmp.icmplim: 200 ############################## 限制系統發送ICMP速率,改為100吧,或者保留也可,並不會給系統帶來太大的壓力。 ########################### net.inet.icmp.icmplim_output: 1 ################################### 如果設置成0,就不會看到提示說Limiting icmp unreach response from 214 to 200 packets per second 等等了 不過禁止輸出容易讓我們忽視攻擊的存在。這個自己看著辦吧。 ###################################### net.inet.icmp.drop_redirect: 0 net.inet.icmp.log_redirect: 0 ################################### 設置為1,屏蔽ICMP重定向功能 ################################### net.inet.icmp.bmcastecho: 0 ############################ 防止廣播風暴,關閉廣播ECHO響應,默認即是,無須修改。 ############################### net.inet.tcp.mssdflt: 512 net.inet.tcp.minmss: 216 ############################### 數據包數據段最小值,以上兩個選項最好不動!或者只修改mssdflt為1460,minmss不動。 ############################# net.inet.tcp.keepidle: 7200000 ###################### TCP的套接字的空閑時間,默認時間太長,可以改為600000(10分鐘)。 ########################## net.inet.tcp.sendspace: 32768 #################http://www.bsdlover.cn######### 最大的待發送TCP數據緩沖區空間,應用程序將數據放到這裏就認為發送成功了,系統TCP堆棧保證數據的正常發送。 #################################### net.inet.tcp.recvspace: 65536 ################################### 最大的接受TCP緩沖區空間,系統從這裏將數據分發給不同的套接字,增大該空間可提高系統瞬間接受數據的能力以提高性能。 ################################### 這二個選項分別控制了網絡 TCP 聯機所使用的傳送及接收暫存區的大小。預設的傳送暫存區為 32K,而接收暫存區為 64K。 如果需要加速 TCP 的傳輸,可以將這二個值調大一點,但缺點是太大的值會造成系統核心占用太多的內存。 如果我們的機器會同時服務數百或數千個網絡聯機,那麽這二個選項最好維持默認值,否則會造成系統核心內存不足。 但如果我們使用的是 gigabite 的網絡,將這二個值調大會有明顯效能的提升。 傳送及接收的暫存區大小可以分開調整, 例如,假設我們的系統主要做為網頁服務器,我們可以將接收的暫存區調小一點,並將傳送的暫存區調大,如此一來,我們就可以避免占去太多的核心內存空間。 net.inet.udp.maxdgram: 9216 ######################### 最大的發送UDP數據緩沖區大小,網上的資料大多都是65536,我個人認為沒多大必要, 如果要調整,可以試試24576。 ############################## net.inet.udp.recvspace: 42080 ################## 最大的接受UDP緩沖區大小,網上的資料大多都是65536,我個人認為沒多大必要, 如果要調整,可以試試49152。 ####################### 以上四項配置通常不會導致問題,一般說來網絡流量是不對稱的,因此應該根據實際情況調整,並觀察其效果。 如果我們將傳送或接收的暫存區設為大於 65535,除非服務器本身及客戶端所使用的操作系統都支持 TCP 協議的 windows scaling extension (請參考 RFC 1323 文件)。 FreeBSD默認已支持 rfs1323 (即 sysctl 的 net.inet.tcp.rfc1323 選項)。 ################################################### net.inet.tcp.log_in_vain: 0 ################## 記錄下任何TCP連接,這個一般情況下不應該更改。 #################### net.inet.tcp.blackhole: 0 ################################## 建議設置為2,接收到一個已經關閉的端口發來的所有包,直接drop,如果設置為1則是只針對TCP包 ##################################### net.inet.tcp.delayed_ack: 1 ########################### 當一臺計算機發起TCP連接請求時,系統會回應ACK應答數據包。 該選項設置是否延遲ACK應答數據包,把它和包含數據的數據包一起發送。 在高速網絡和低負載的情況下會略微提高性能,但在網絡連接較差的時候, 對方計算機得不到應答會持續發起連接請求,反而會讓網絡更加擁堵,降低性能。 因此這個值我建議您看情況而定,如果您的網速不是問題,可以將封包數量減少一半 如果網絡不是特別好,那麽就設置為0,有請求就先回應,這樣其實浪費的網通、電信的帶寬速率而不是你的處理時間:) ############################ net.inet.tcp.inflight.enable: 1 net.inet.tcp.inflight.debug: 0 net.inet.tcp.inflight.rttthresh: 10 net.inet.tcp.inflight.min: 6144 net.inet.tcp.inflight.max: 1073725440 net.inet.tcp.inflight.stab: 20 ########################### 限制 TCP 帶寬延遲積和 NetBSD 的 TCP/Vegas 類似。 它可以通過將 sysctl 變量 net.inet.tcp.inflight.enable 設置成 1 來啟用。 系統將嘗試計算每一個連接的帶寬延遲積,並將排隊的數據量限制在恰好能保持最優吞吐量的水平上。 這一特性在您的服務器同時向使用普通調制解調器,千兆以太網,乃至更高速度的光與網絡連接 (或其他帶寬延遲積很大的連接) 的時候尤為重要, 特別是當您同時使用滑動窗縮放,或使用了大的發送窗口的時候。 如果啟用了這個選項,您還應該把 net.inet.tcp.inflight.debug 設置為 0 (禁用調試), 對於生產環境而言, 將 net.inet.tcp.inflight.min 設置成至少 6144 會很有好處。 然而, 需要註意的是,這個值設置過大事實上相當於禁用了連接帶寬延遲積限制功能。 這個限制特性減少了在路由和交換包隊列的堵塞數據數量,也減少了在本地主機接口隊列阻塞的數據的數量。 在少數的等候隊列中、交互式連接,尤其是通過慢速的調制解調器,也能用低的 往返時間操作。 但是,註意這只影響到數據發送 (上載/服務端)。對數據接收(下載)沒有效果。 調整 net.inet.tcp.inflight.stab 是 不 推薦的。 這個參數的默認值是 20,表示把 2 個最大包加入到帶寬延遲積窗口的計算中。 額外的窗口似的算法更為穩定,並改善對於多變網絡環境的相應能力, 但也會導致慢速連接下的 ping 時間增長 (盡管還是會比沒有使用 inflight 算法低許多)。 對於這些情形, 您可能會希望把這個參數減少到 15, 10, 或 5; 並可能因此而不得不減少 net.inet.tcp.inflight.min (比如說, 3500) 來得到希望的效果。 減少這些參數的值, 只應作為最後不得已時的手段來使用。 ############################ net.inet.tcp.syncookies: 1 ######################### SYN cookies是一種用於通過選擇加密的初始化TCP序列號,可以對回應的包做驗證來降低SYN'洪水'攻擊的影響的技術。 默認即是,不需修改 ######################## net.inet.tcp.msl: 30000 ####################### 這個值網上很多文章都推薦的7500, 還可以改的更小一些(如2000或2500),這樣可以加快不正常連接的釋放過程(三次握手2秒、FIN_WAIT4秒)。 ######################### net.inet.tcp.always_keepalive: 1 ########################### 幫助系統清除沒有正常斷開的TCP連接,這增加了一些網絡帶寬的使用,但是一些死掉的連接最終能被識別並清除。 死的TCP連接是被撥號用戶存取的系統的一個特別的問題,因為用戶經常斷開modem而不正確的關閉活動的連接。 ############################# net.inet.udp.checksum: 1 ######################### 防止不正確的udp包的攻擊,默認即是,不需修改 ############################## net.inet.udp.log_in_vain: 0 ####################### 記錄下任何UDP連接,這個一般情況下不應該修改。 ####################### net.inet.udp.blackhole: 0 #################### 建議設置為1,接收到一個已經關閉的端口發來的所有UDP包直接drop ####################### net.inet.raw.maxdgram: 8192 ######################### Maximum outgoing raw IP datagram size 很多文章建議設置為65536,好像沒多大必要。 ###################################### net.inet.raw.recvspace: 8192 ###################### Maximum incoming raw IP datagram size 很多文章建議設置為65536,好像沒多大必要。 ####################### net.link.ether.inet.max_age: 1200 #################### 調整ARP清理的時間,通過向IP路由緩沖填充偽造的ARP條目可以讓惡意用戶產生資源耗竭和性能減低攻擊。 這項似乎大家都未做改動,我建議不動或者稍微減少,比如300(HP-UX默認的5分鐘) ####################### net.inet6.ip6.redirect: 1 ############################### 設置為0,屏蔽ipv6重定向功能 ########################### net.isr.direct: 0 #################http://www.bsdlover.cn######### 所有MPSAFE的網絡ISR對包做立即響應,提高網卡性能,設置為1。 #################################### hw.ata.wc: 1 ##################### 這個選項用來打開 IDE 硬盤快取。當打開時,如果有數據要寫入硬盤時,硬盤會假裝已完成寫入,並將數據快取起來。 這種作法會加速硬盤的存取速度,但當系統異常關機時,比較容易造成數據遺失。 不過由於關閉這個功能所帶來的速度差異實在太大,建議還是保留原本打開的狀態吧,不做修改。 ################### security.bsd.see_other_uids: 1 security.bsd.see_other_gids: 1 ##################### 不允許用戶看到其他用戶的進程,因此應該改成0, #######################