apache的并發數
添加時間:2011-2-26
添加:
admin
一、夠用就好
可以理解為web服務器是一條高速公路,如果出現讓每一條車道都足夠寬,那么消耗了很多的路面資源,能跑的車就少了。同樣web服務器也是這樣,不是所有的配置調整的越大越好,一般php+mysql+apache的架構,因為老碰到mysql連接數滿的問題,所以把mysql連接數設置的非常高,同時加大mysql cache結果導致負載很高的時候,內存被大量消耗導致服務器頻繁死機。
后來檢查了下程序,發現mysql連接數過高是由于程序編寫不合理造成了,調整了下,服務器連接數就下來了:很多人可能跟我一樣寫php數據庫查詢完以后沒有立即關閉數據庫的習慣,讓進程終止后系統自動回收打開的數據連接,但是如果系統非常慢的時候,執行一個php需要花費非常長是時間,那么導致mysql數據庫一直保持著,導致連接數非常高,這樣數據庫消耗大量的內存,導致系統頻繁使用swap,導致系統更加慢,然后惡性循環,最終服務器發生菪機。一個原則:在需要數據庫的時候才打開數據庫連接,一旦數據讀取完成,立即關閉數據庫。另外mysql cache的大小也不應該設置太大,應該經常使用show status命令察看下mysql的情況,按照實際需求配置mysql相關的chache 和最大連接數。
檢測Mysql的性能可以通過 select benchmark(100000,sql語句) 來檢查mysql運行100000那個sql語句需要的時間。
你可以可以通過 SELECT * FROM 表名 PROCEDURE ANALYSE ( ) 來分析各個子段類型大小是否設置合適
二、研究是web的限制和系統本身的限制
linux 內核對打開的文件數一些有限制,一般可以通過ulimit -a 察看,/proc目錄下有一些相關的最大值的控制,當服務器出現菪機的時候,一定要分析一下/var/log/message目錄下的文件,機器菪機前系統報了什么錯誤。如果機器還能操作你可以使用命令dmesg看看內核當時出現了那些錯誤
如果是內核的限制看下 http://shika.aist-nara.ac.jp/member/atsush-m/doc/kernel_tune.html 重新編譯下內核,看這篇文章的時候注意一點這份文檔居然沒讓你改大include/linux/fs.h NR_FILE,需要將NR_FILE設置成INR_OPEN的三倍大小,千萬不要小于INR_OPEN,光光打開apache的HARD_SERVER_LIMIT 是不夠的。
檢測打開的文件數是否夠用可以運行下 more /proc/sys/fs/file-nr ,第一個值是系統已經分配的句柄數(你可以理解為系統打開最大的句柄數),第二個值是系統當前使用句柄數,第三個值是系統允許打開得句柄數,如果第一個值等于第三個值你需要考慮是否需要增加系統打開的句柄數,一方面你可以echo 一個比較大的值到 /proc/sys/fs/file-max,但是內核編譯的時候決定了系統最大的文件數,這個值超過內核編譯時候設置的內核數就需要重新編譯內核來支持。
如果機器有一定的內存,可以把bdflush的值設大,類似這樣
echo "100 128 128 512 5000 3000 60 0 0">/proc/sys/vm/bdflush
希望長期有效的話可以配放在rc.local下
這個值具體什么意思可以運行 update -d 看下具體的解釋
另外如果你懷疑有Dos攻擊的話,可以運行
netstat -an | grep -i "服務器ip地址:80" | awk '{print $6}' | sort | uniq -c | sort -n
這個命令會自動統計Tcp連接各個狀態的數量,如果SYN_RECV很高的話(我的機器出現過給人建立了4000個SYN_RECV的事情。。。),就不能排除有基于tcp協議的ddos攻擊的可能
這樣的話,你需要打開tcp_syncookies
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
如果沒有 /proc/sys/net/ipv4/tcp_syncookies說明你的內核不支持syncookies,需要重新編譯內核
同時
降低syn重試次數
echo "1" > /proc/sys/net/ipv4/tcp_syn_retries
echo "1" > /proc/sys/net/ipv4/tcp_synack_retries
加大syn_backlog,以保證用戶的訪問(消耗內存為代價,設的太高。。)
echo "2048" > /proc/sys/net/ipv4/tcp_max_syn_backlog
如果還是不行,那么只能交給相應的硬件防火墻了
如果機器是用來做虛擬主機的話,如果有很多行
。。。。。。
這樣的東東的話(我看見過一個人配了1000個不同的域名在一個機器里面,佩服他的耐心)可以考慮使用mod_rewrite方式來做,可以通過增加一個rewrite規則到apache里面,實現域名對應自動對應某個目錄
三、不要太迷信一些第三方的加速軟件
相信很多人在服務器負載較高的時候使用mod_limitipconn,mmcache等做服務器的加速,但是mod_limitipconn需要打開ExtendedStatus,反而會導致服務器性能下降,同樣由于自身程序寫得不夠規范也可能導致mmcache這樣的php加速軟件使用的時候發生一些問題。
如果條件許可,盡量建立cms系統讓動態的葉面以靜態的葉面顯示
關鍵字:apache 并發數
可以理解為web服務器是一條高速公路,如果出現讓每一條車道都足夠寬,那么消耗了很多的路面資源,能跑的車就少了。同樣web服務器也是這樣,不是所有的配置調整的越大越好,一般php+mysql+apache的架構,因為老碰到mysql連接數滿的問題,所以把mysql連接數設置的非常高,同時加大mysql cache結果導致負載很高的時候,內存被大量消耗導致服務器頻繁死機。
后來檢查了下程序,發現mysql連接數過高是由于程序編寫不合理造成了,調整了下,服務器連接數就下來了:很多人可能跟我一樣寫php數據庫查詢完以后沒有立即關閉數據庫的習慣,讓進程終止后系統自動回收打開的數據連接,但是如果系統非常慢的時候,執行一個php需要花費非常長是時間,那么導致mysql數據庫一直保持著,導致連接數非常高,這樣數據庫消耗大量的內存,導致系統頻繁使用swap,導致系統更加慢,然后惡性循環,最終服務器發生菪機。一個原則:在需要數據庫的時候才打開數據庫連接,一旦數據讀取完成,立即關閉數據庫。另外mysql cache的大小也不應該設置太大,應該經常使用show status命令察看下mysql的情況,按照實際需求配置mysql相關的chache 和最大連接數。
檢測Mysql的性能可以通過 select benchmark(100000,sql語句) 來檢查mysql運行100000那個sql語句需要的時間。
你可以可以通過 SELECT * FROM 表名 PROCEDURE ANALYSE ( ) 來分析各個子段類型大小是否設置合適
二、研究是web的限制和系統本身的限制
linux 內核對打開的文件數一些有限制,一般可以通過ulimit -a 察看,/proc目錄下有一些相關的最大值的控制,當服務器出現菪機的時候,一定要分析一下/var/log/message目錄下的文件,機器菪機前系統報了什么錯誤。如果機器還能操作你可以使用命令dmesg看看內核當時出現了那些錯誤
如果是內核的限制看下 http://shika.aist-nara.ac.jp/member/atsush-m/doc/kernel_tune.html 重新編譯下內核,看這篇文章的時候注意一點這份文檔居然沒讓你改大include/linux/fs.h NR_FILE,需要將NR_FILE設置成INR_OPEN的三倍大小,千萬不要小于INR_OPEN,光光打開apache的HARD_SERVER_LIMIT 是不夠的。
檢測打開的文件數是否夠用可以運行下 more /proc/sys/fs/file-nr ,第一個值是系統已經分配的句柄數(你可以理解為系統打開最大的句柄數),第二個值是系統當前使用句柄數,第三個值是系統允許打開得句柄數,如果第一個值等于第三個值你需要考慮是否需要增加系統打開的句柄數,一方面你可以echo 一個比較大的值到 /proc/sys/fs/file-max,但是內核編譯的時候決定了系統最大的文件數,這個值超過內核編譯時候設置的內核數就需要重新編譯內核來支持。
如果機器有一定的內存,可以把bdflush的值設大,類似這樣
echo "100 128 128 512 5000 3000 60 0 0">/proc/sys/vm/bdflush
希望長期有效的話可以配放在rc.local下
這個值具體什么意思可以運行 update -d 看下具體的解釋
另外如果你懷疑有Dos攻擊的話,可以運行
netstat -an | grep -i "服務器ip地址:80" | awk '{print $6}' | sort | uniq -c | sort -n
這個命令會自動統計Tcp連接各個狀態的數量,如果SYN_RECV很高的話(我的機器出現過給人建立了4000個SYN_RECV的事情。。。),就不能排除有基于tcp協議的ddos攻擊的可能
這樣的話,你需要打開tcp_syncookies
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
如果沒有 /proc/sys/net/ipv4/tcp_syncookies說明你的內核不支持syncookies,需要重新編譯內核
同時
降低syn重試次數
echo "1" > /proc/sys/net/ipv4/tcp_syn_retries
echo "1" > /proc/sys/net/ipv4/tcp_synack_retries
加大syn_backlog,以保證用戶的訪問(消耗內存為代價,設的太高。。)
echo "2048" > /proc/sys/net/ipv4/tcp_max_syn_backlog
如果還是不行,那么只能交給相應的硬件防火墻了
如果機器是用來做虛擬主機的話,如果有很多行
。。。。。。
這樣的東東的話(我看見過一個人配了1000個不同的域名在一個機器里面,佩服他的耐心)可以考慮使用mod_rewrite方式來做,可以通過增加一個rewrite規則到apache里面,實現域名對應自動對應某個目錄
三、不要太迷信一些第三方的加速軟件
相信很多人在服務器負載較高的時候使用mod_limitipconn,mmcache等做服務器的加速,但是mod_limitipconn需要打開ExtendedStatus,反而會導致服務器性能下降,同樣由于自身程序寫得不夠規范也可能導致mmcache這樣的php加速軟件使用的時候發生一些問題。
如果條件許可,盡量建立cms系統讓動態的葉面以靜態的葉面顯示
關鍵字:apache 并發數
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解