python uwsgi 部署以及優化

    這篇文章其實兩個月以前就應該面世了,可是最近雜事、煩心事太多就一直懶得動筆,拖到如今才寫php

    

   1、uwsgi、wsgi、fastcgi區別和聯繫html

         參見以前的文章 http://www.cnblogs.com/sky20081816/p/3309925.html前端

 

 

  2、uwsgi的安裝python

        建議用pip 或者easy_install安裝,這樣避免了不少的麻煩,我是直接用 pip install uwsgi來安裝的。若是你想要用源碼安裝的話到官網http://projects.unbit.it/uwsgi/ 下載安裝linux

        今天遇到在centos6.4下用pip安裝失敗的狀況,結果發現因爲centos6.4的python版本仍是2.6.6致使。所以centos6.4要升級python版本到2.7才行 (2013-11-25補充)nginx

 

  3、demo演示git

       demo1 : 最簡單的web

       

       demo2 :http參數獲取的數據庫

       

      

 

4、調試json

     一、本身作webserver  

         uwsgi --http :9090 --wsgi-file {you process file},這樣就啓動了,你能夠 curl localhost:9090來測試它了

     二、前端用nginx代理

          uwsgi --socket 127.0.0.1:9090 --wsgi-file {you process file}

         這個時候nginx的配置以下        

     location / {
     include uwsgi_params;
     uwsgi_pass 127.0.0.1:9090;
     }

        而後就能夠經過nginx制定的域名訪問代碼

 

5、參數優化

     首先參考下官網的 things to know : http://uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html

     我這邊最終啓動的命令以下: 

     uwsgi --socket 127.0.0.1:9090 -p 16 -l 8192 -M -R 100000  -z30 -L --wsgi-file  app.py --max-apps 65535 --stats 127.0.0.1:1717 --post-buffering 100M --cpu affinity --buffer-size 65535 --daemonize /tmp/uwsgi --pidfile /tmp/uwsgi.pid  --memory-report --threads 16

   

    一、-p

         啓動16個進程,注意這裏不是16核就啓動16個進程,要根據代碼實際運行狀況來定奪 (There is no magic rule for setting the number of processes or threads to use. It is very much application and system dependent. Simple math                  like processes = 2 * cpucores will not be enough. You need to experiment with various setups and be prepared constantly monitor your apps. uwsgitop could be a great tool to find the best values.)

         這裏已經告訴你了,經過uwsgitop來判斷,至於如何用uwsgitop,下面我會講到

   二、-l 

        linux內核監聽網絡隊列長度,這個稍微大一點

   三、-M

         master模式,啓動主進程

   四、-R 

        --max-requests的簡寫, reload workers after the specified amount of managed requests。一個worker完成多少個請求之後就重啓

   五、-z

       --socket-timeout的縮寫                    set internal sockets timeout

   六、-L

        --disable-logging的縮寫                  disable request logging,禁掉請求的系統日誌,調試模式下要打開,生產環境注意關閉,這個東西很影響效率

   七、--wsgi-file 

        程序入口

   八、--max-apps

        set the maximum number of per-worker applications,這個沒啥特別大的意義,可不要

   九、--stats 127.0.0.1:1717

        監控程序的url,只有設置了這個參數之後才能用 uwsgitop 1717來觀看監控,相似於linux的top命令,後面會專門提到

   10 --post-buffering

         enable post buffering,if an HTTP request has a body (like a POST request generated by a form), you have to read (consume) it in your application. If you do not do this, the communication socket with your webserver may be clobbered. If you are lazy you can use the post-buffering option that will automatically read data for you. For Rack applications this is automatically enabled.

 

    十一、--cpu affinity

         cpu親和,也就是一個進程儘可能不要切換cpu,由於切換cpu會消耗,可是實際測試過程當中這個參數影響不大

  

    十二、--buffer-size

          set internal buffer size

 

    1三、--daemonize

        以守護的形式運行uwsgi,運行的日誌會保存在/tmp/uwsgi裏面,記得啓動之後vim /tmp/uwsgi來看下是否有錯誤日誌

    1四、--pidfile 

         uwsgi程序的進程id所保存的文件,當我想要關閉uwsgi的時候只須要 uwsgi --stop /tmp/uwsgi.pid便可,還有重啓uwsgi --reload /tmp/uwsgi.pid

    1五、 --memory-report 

        開啓內存報告,在uwsgitop命令下能夠看到內存使用狀況

    1六、--threads

       開啓的線程數,要根據uwsgitop的監控狀況來具體調整

 

 

6、監控

     uwsgi提供了一個很nice的監控工具,uwsgitop。它的安裝也很簡單 pip install uwsgitop,安裝之後 它會存在於 /usr/local/python27/bin/uwsgitop

    運行 /usr/local/python27/bin/uwsgitop :1717,出現下面的圖片

   

  而後查看下cpu的使用率,內存使用了,STATUS有幾個是busy狀態的,再具體判斷使用幾個進程,幾個進程

 

7、壓測

   以前我壓力測過,圖片不見了我就懶得上傳了

   若是僅僅是demo1上的最簡單的功能,qps可以達到4W+,當時我都驚呆了,可是後來涉及到複雜的邏輯,還有鏈接數據庫等狀況下,它的效率跟nginx +php差不太多

 

8、總結

   python作webserver我不是很推薦,由於python的數據結構限制的比較死,我就碰到過幾回編碼啊、json格式啊、unicode等問題。並且不一樣的python版本對於函數的支持也不同,好比說md5.

   可是它也有好處就是若是用uwsgi的話部署很方便。

   有利有弊吧,我總以爲python仍是作一些大數據啊、統計分析啊、複雜運算啊比較給力,若是是作webserver仍是php給力。

相關文章
相關標籤/搜索