對於高效能** ,請求量大,如何支撐?
1方面,要減少請求
對於開發人員----合併css, 背景, 減少mysql查詢等.
2: 對於運維 nginx的expires ,利用瀏覽器快取等,減少查詢.
3: 利用cdn來響應請求
4: 最終剩下的,不可避免的請求----伺服器集群+負載均衡來支撐.
所以,來到第4步後,就不要再考慮減少請求這個方向了.
而是思考如何更好的響應高併發請求.
大的認識-------既然響應是不可避免的,我們要做的是把工作內容」平均」分給每台伺服器.
最理想的狀態 每台伺服器的效能都被充分利用.
優化過程:
1:判斷nginx的瓶頸
1.1: 首先把ab測試端的效能提高,使之能高併發的請求.
易出問題: too many open files
原因 : ab在壓力測試時,開啟的socket過多
解決: ulimit -n 30000 (重啟失效)
觀察結果: nginx 不需要特殊優化的情況下, 5000個連線,1秒內響應.
滿足要求,但 wating狀態的連線過多.
1.2: 解決waiting程序過多的問題.
解決辦法: keepalive_timeout = 0;
即: 請求結果後,不保留tcp連線.
在高併發的情況下, keepalive會佔據大量的socket連線.
結果: waiting狀態的連線明顯減少.
1.3: 解決服務端 too many open files
分析: nginx要響應,
1是要建立socket連線,
2 是要讀本地檔案
這兩個者限制.
由上圖可看出,nginx的問題容易出在2點上:
1: nginx接受的tcp連線多,能否建立起來?
2: nginx響應過程,要開啟許多檔案 ,能否開啟?
第1個問題: 在核心層面(見下)
第2個問題 (見下)
系統核心層面:
net.core.somaxconn = 4096 允許等待中的監聽
net.ipv4.tcp_tw_recycle = 1 tcp連線快速**
net.ipv4.tcp_tw_reuse = 1 tcp連線重用
net.ipv4.tcp_syncookies = 0 不抵禦洪水攻擊
ulimit -n 30000
nginx層面:
解決: nginx.conf 下面: work_connection 加大
worker_connections 10240;
worker_rlimit_nofiles 10000;
keepalive_timeout 0;
nginx---->php-fpm之間的優化:
如上圖,在很多個nginx來訪問fpm時, fpm的程序要是不夠用, 會生成子程序.
生成子程序需要核心來排程,比較耗時,
如果**併發比較大,
我們可以用靜態方式一次性生成若干子程序,保持在記憶體中.
方法 -- 修改php-fpm.conf
pm = static 讓fpm程序始終保持,不要動態生成
pm.max_children= 32 始終保持的子程序數量
php-mysql的優化:
linux機器下 ,php 通過ip連線其他mysql伺服器時,容易出的問題
能ping能,但connect不到.
一般是由:mysql伺服器的防火牆影響的.
併發1萬連線,響應時間過長.
優化思路: 同上的nginx
1: 核心層面,加大連線數,並加快tcp**
2: mysql層面,增大連線數
3: php層面,用長連線,節省連線數
4: 用memcached快取,減輕mysql負擔
具體:1.1 , php伺服器增大 ulimint -n選項
1.2 mysql伺服器核心配置
新增或修改如下選項
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 0
# syscttl -p 使修改立即生效
2.1 修改mysql.cnf
vi /etc/my.conf
# service mysqld restart 重啟mysql
3.1 php層面 ,用長連線
mysql_connect ---> mysql_pconnect
注: pconnect 在php以apache模組的形式存在時,無效果.
nginx+phjp+mysql+nginx
在引入memcached後,效能提公升不明顯,甚至還略有下降
memcached使50%的請求變快了,但是一部分,反倒慢了.
原因在於--php->memcached也要建立tcp連線,代價挺高,
但快取了資料之後,就省去了mysql的查詢時間.
總結: memcached適合存複雜的sql,尤其是連線查詢/模糊查詢的sql結果
memcached伺服器的優化(集中在核心的ipv4設定上,不再重複)
jemalloc優化MySQL Nginx記憶體管理
jemalloc源於jason evans 2006年在bsdcan conference發表的 a scalable concurrent malloc implementation for freebsd jason認為phkmalloc freebsd s previous malloc im...
Docker的mysql nginx高配版部署
這裡所說的高配版,意思是並非簡單的在docker上跑乙個容器,而是執行的容器軟體可被使用者自定義配置,可直接用於生產環境,當然如果生產環境用k8s的話就另說了。宿主機 192.168.70.134 1.docker執行 docker run d name mysql p 3306 3306 p 33...
MediaSoup demo模組增加nginx
相關連線 webrtc 框架學習 一 mediasoup基本框架學習 使用docker 搭建mediasoup服務 mediasoup demo模組增加nginx 使用docker 搭建mediasoup服務 github專案路徑 docker hub 路徑 nginx 配置檔案 nginx.con...