上一章將nginx +uwsgi搭建起來,將keystone掛載後面。但是發現一個問題,如果http請求達到一定量後,nginx直接返回502。這讓需要部署大規模openstack集羣的我很是頭疼,比較了一下請求的處理能力,keystone 原生的api 接口是可以承受一定量的大規模併發請求的。這就讓我思考一個問題,爲什麼nginx作爲web,性能卻沒有keystone api 自身的承載能力好呢。於是我做了壓測,查了一下原因。
服務器配置:24 cpu+200G mem+1T disk
系統:centos 7.1
部署:kesytone nginx+uwsgi
先將keystone部署在nginx+uwsgi 後端
在同機房的另外一臺服務器上發起壓測:
ab -r -n 100000 -c 100 -H "User-Agent: python-keystoneclient" -H "Accept: application/json" -H "X-Auth-Token: 65e194" http://keystonehost:35357/v2.0/
發現http處理正常。然後改一下併發數到200.發現大概50%的返回爲502。
然後我將keystone-api 卻換成keystone 自身的服務openstack-keystone。再次用200併發壓測:發現處理正常,沒有返回502的。
ab -r -n 100000 -c 200 -H "User-Agent: python-keystoneclient" -H "Accept: application/json" -H "X-Auth-Token: 65e194" http://keystonehost:35357/v2.0/
大概知道問題應該在nginx和uwsgi上,限制了併發的處理數。
查了nginx uwsgi官方的資料。原來調優有好幾個參數,並且系統本身也需要做一些調優
1.首先先看一下nginx.conf裏影響處理的配置。
user nginx; worker_processes xx; #可以設置成cpu個數,體驗較佳的性能 error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; worker_rlimit_nofile 65535; # 最大打開文件數,這個值需要<= worker_connections events { worker_connections 65535; # 最大連接數,這個值依賴系統的配置。 }
2.看一下系統的配置sysctl.conf
net.core.somaxconn = 2048 #定義了系統中每一個端口最大的監聽隊列的長度,這是個全局的參數。默認是128.優化可以根據系統配置做優化
3.uwsgi 的配置優化/etc/uwsgi.d/admin.ini
workers = 24 # 併發處理進程數 listen = 65535 # 併發的socket 連接數。默認爲100。優化需要根據系統配置
在做優化之前,發現併發數過不了100.原因就是這裏,uwsgi 的socket 默認鏈接爲100.
做完調優,在此壓測了一下性能,併發爲10000時:
ab -r -n 100000 -c 10000 -H "User-Agent: python-keystoneclient" -H "Accept: application/json" -H "X-Auth-Token: 65e194" http://keystonehost:35357/v2.0/
壓測報告:
Server Software: nginx/1.8.1 Server Hostname: keystonehost Server Port: 35357 Document Path: /v2/ Document Length: 450 bytes Concurrency Level: 15000 Time taken for tests: 30.136 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Total transferred: 72900000 bytes HTML transferred: 45000000 bytes Time per request: 4520.417 [ms] (mean) Transfer rate: 2362.33 [Kbytes/sec] received
這個時候切換到keystone自身服務openstack-keystone。併發爲1000時。
壓測報告:
Server Software: Server Hostname: keystonehost Server Port: 35357 Document Path: /v2/ Document Length: 450 bytes Concurrency Level: 10000 Time taken for tests: 100.005 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Total transferred: 70800000 bytes HTML transferred: 45000000 bytes Time per request: 10000.507 [ms] (mean) Transfer rate: 691.37 [Kbytes/sec] received
可以看出,openstack-keystone服務到併發爲1000時,api服務已經到極限了。
所以nginx+uswgi 經過調優後,nginx的高性能立即體現出來。
大家要是還有更好的調優方式,歡迎大家貼出來一起學習哈。