解決uwsgi開多少進程才能最大使用服務器

先來看一下我的服務器配置:

[root@Y]# cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l
2
[root@Y]# cat /proc/cpuinfo |grep "cores"|uniq
cpu cores       : 8
[root@Y]# cat /proc/cpuinfo |grep "processor"|wc -l
32

[root@Y]# free -g
             total       used       free     shared    buffers     cached
Mem:           125         57         68          0          1         30
-/+ buffers/cache:         25        100
Swap:            0          0          0

本服務器有2個實物cpu,每個cpu有8個核心,每個核心虛出(超線程數)2個邏輯cpu,所以一共有32個cpu,128G內存
每個cpu平均分配到的內存爲4G,系統佔用2GB空間,用戶佔用2GB空間

那麼根據linux的默認進程和線程大小計算:
默認一個進程的堆棧大小是2GB
默認一個線程的堆棧大小是1MB
所以一個進程可以開2G/1M=2048個線程,但實際上內存當然不可能完全拿來作線程的棧,所以實際數目要比這個值要小,一般情況會達到1500個線程。

wsgi.yaml的配置信息如下:

processes: 32  # 範圍:1~32
threads: 800  # 範圍:1~1500
。。。

按照我的服務器的32C128G配置,uwsgi的常規分配是 32 processes,800 threads。

這個配置是不是能最大程度的利用服務器呢?不一定,按照這個配置啓動服務後,看一下服務器的 cpu,內存使用情況:htop(或 top)、free -g
如果cpu和內存的使用率還都是很低的話,還可以往上加,驚不驚喜,意不意外!

接下來我們在分析一下兩種情況:
IO密集型:相當於CPU工作時間無窮小的情況,這時候的線程數要調到最大,才能最大利用服務器。
計算密集型:相當於IO時間無窮小,計算的進程數約等於CPU核數,才能最大利用服務器。

如果processes 配置的數值超過 32了,有的時候反而會降低服務器的性能,因爲cpu需要有調度和分配,這也會耗費資源。

分享個例子吧,有助於理解:
火車站入口的閘門一共有32個,只開放2個門和開放32個,同時能夠通過的客流量是很大不同的(擴進程);
還是32個閘門,每個閘門一般會有一個剪票員,如果配兩個剪票員,同時能夠通過的客流量就會增大(擴線程);

影響服務器使用率的另一個很重要的因素就是程序的質量,如果一個http請求進來,程序執行完返回,一共花了100ms或之上,這樣的話需要開夠多的線程,但主要問題還是程序要進行優化。

所以,問題回到如何配置uwsgi的參數,才能最大化利用服務器?
即使服務器的配置都是一樣的,但是不一樣的程序,處理請求所用的時間也是不同的,這就能影響到uwsgi參數的配置。最好的辦法就是通過 壓測來測試,從而不斷調優uwsgi的參數,上面我只是提供了一個常規的配置而已。

有幫到你就好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章