場景
在最近一次開發(fā)過程中遇見這個(gè)這樣的問題:在面臨突發(fā)性大量用戶涌進(jìn)系統(tǒng)的時(shí)候析砸,服務(wù)器的資源使用并不高窿侈,cpu使用率28%左右磷醋,內(nèi)存的使用率40%左右但是依然會(huì)造成系統(tǒng)卡頓冕臭,請求超時(shí)等問題。百思不得其解頭發(fā)都快抓掉完了~卷胯。系統(tǒng)也未發(fā)現(xiàn)sql慢查詢等操作瘟裸,修改php的最大鏈接數(shù),進(jìn)程數(shù)等配置依然不見得到改善诵竭。思來想去大概確定問題應(yīng)該出現(xiàn)在php代碼的身上,由于php處理任務(wù)時(shí)間過長一直占據(jù)著進(jìn)程得不到釋放兼搏,在大量請求的請求的情況下后面的一直處于等待狀態(tài)卵慰,等待時(shí)候過長就會(huì)出現(xiàn)504,系統(tǒng)卡頓的情況佛呻。目前可以確定不是硬件問題裳朋,sql瓶頸問題,所以問題在于php瓶頸大概會(huì)有以下幾個(gè)地方:
- 1.大量新用戶涌進(jìn)的時(shí)候請求微信授權(quán)登陸吓著,以及分享判斷業(yè)務(wù)邏輯時(shí)業(yè)務(wù)處理太慢導(dǎo)致鏈接數(shù)過多(經(jīng)過并發(fā)測試問題不出現(xiàn)在這)
- 2.用戶提現(xiàn)請求請求數(shù)量太大鲤嫡,商戶支付時(shí)請求數(shù)太多占用進(jìn)程(可能性最大)。
- 3.還在找绑莺。哈哈哈哈(找到了告訴你們)
思來想去既然服務(wù)的資源使用不多還不到50%暖眼,處理不過來的是php,如果使用多個(gè)php去執(zhí)行這些任務(wù)就會(huì)得到改善纺裁,這個(gè)時(shí)候直覺就是負(fù)載均衡诫肠。在以往的負(fù)載均衡里都是多臺服務(wù)器搭建一樣的運(yùn)行環(huán)境然配置nginx的proxy_pass反向代理到http請求上,但是現(xiàn)在問題在于服務(wù)器資源使用只有三分鐘一欺缘,再購買服務(wù)器會(huì)有點(diǎn)浪費(fèi)栋豫,也不是最根本的辦法,想到docker-compose scale的參數(shù)可以設(shè)置啟動(dòng)容器的數(shù)量谚殊,唉~我可以啟動(dòng)多個(gè)容器然后使用nginx負(fù)載聚合每次訪問不用的phpfpm容器處理任務(wù)的啊丧鸯,提起袖子說干就干。嫩絮。丛肢。
實(shí)現(xiàn)思路
啟動(dòng)多個(gè)phpfpm容器,利用nginx負(fù)載均衡分配處理任務(wù)的容器
具體配置
- 搭建docker絮记,docker-compose等騷操作我就不說摔踱,趕緊寫完擼代碼
- pull你想要的php版本
- docker-compose.yml 配置
nginx:
image: nginx:stable
ports:
- 80:80
- 443:443
volumes:
- ./vhost:/etc/nginx/conf.d
- ../Code:/var/www/html
links:
- phpfpm
- phpfpm2
//第一個(gè)phpfpm
phpfpm:
image: php:v7.2
volumes:
- ../Code:/var/www/html
- ./php-fpm7.2/queue:/etc/supervisor/conf.d
# ports:
# - "9000"
# - "9501:9501"
//第二個(gè)phpfpm
phpfpm2:
image: php:v7.2
volumes:
- ../Code:/var/www/html
- ./php-fpm7.2/queue:/etc/supervisor/conf.d
# ports:
# - "9000"
# - "9501:9501"
- nginx 配置(test.com.conf)
upstream webs {
server phpfpm:9000;
server phpfpm2:9000;
}
server {
listen 80 ;
server_name test.xx;
root /var/www/html/test;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location ^~ /web/ {
if (!-e $request_filename) {
rewrite ^(.*)$ /web/index.html break;
}
}
location / {
index index.php index.html index.htm;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
location ~ \.php(.*)$ {
fastcgi_pass webs; //注意這里
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
- docker-compost up -d 啟動(dòng)服務(wù)
- 配置hosts訪問項(xiàng)目即可(測試提示:phpfpm,phpfpm2掛載到不同的項(xiàng)目路徑,訪問test.xx會(huì)發(fā)現(xiàn)每次的請求都會(huì)被隨機(jī)分配到這些這兩個(gè)容器內(nèi)處理任務(wù))
缺陷
- 然并luan怨愤,并沒有解決并發(fā)下造成的卡頓問題
- session派敷,緩存等,不能存儲在容器,需借助reids
- 服務(wù)器資源消耗明顯增高了