初看這個標題,相信很多同學都笑了,python有性能可言么,呵呵噠...確實哦,python其實就是為了快速開發應用而出生的,雖然python的服務都以性能低而聞名全世界,但是總該有優化的地方吧,呵呵噠....
這不,這兩天本作者就碰見了這樣一個問題,首先自我介紹下,我是干嘛的,肯定是屌絲程序員了,這個猜都不用猜,要不然也不會蛋疼的寫這篇文章了,我們組是基礎開發組,就是專門開發一些剝離業務的組件讓其他部門去用,比如業務監控,業務報警,服務數據采集等等一堆搬磚的活.好了,廢話不多說了,估計看到這的也都看煩了...你們真的煩了么
這樣滴,我們這有個收集業務數據的組件簡稱M好啦,首先他要在業務服務器上建個udpserver,然后就靜靜的等業務的客戶端上報數據過來,數據格式是key-value形式的,然而就在最近幾天,有人在給業務機器做壓測的時候,發現一個問題,隨著并發的增加,這個M組件的cpu使用率也在不斷上升,擦,這下服務器不愿意了,開始瘋狂報警,然后做壓測的那個人就找我這來了,巴拉巴拉一堆,意思就是我給業務做壓測,你收集數據的組件飚個毛啊......
然而我是那么容易被打倒的么,就解釋說當然啊,你在給業務壓測的時候,同時你的client也在請求我啊,相當于我的并發量也在上升啊,不飚才怪呢,好吧,說歸說,抱著工匠精神,開始找問題吧...
這個M組件是用python寫的多線程的udpserver,經本人測試,當并發達到2000的時候,cpu就100%左右了,其實udp相比tcp而言性能已經很高了,不過這個并發還是有點感人啊,改成多進程也試了下,cpu占用還是70%左右,畢竟多進程適用計算密集型的,于是就想到了協程,協程像是一種在程序級別來模擬系統級別 的進程,由于是單進程,并且少了上下文切換,于是相對來說系統消耗很少,而網上的各種測試也表明,協程確實擁有驚人的速度。并且在實現過程中,協程可以 用以前同步思路的寫法,而運行起來確是異步的,挺有意思。
聽說python有個模塊叫做eventlet很強大,eventlet的核心是協程(也叫做green thread)。協程的好處是沒有線程開銷來的大(比如切換代價很小)。同時協程由于調度都由開發者自己決定,所以對lock的需求就很低了
上面是一個uds(unix domian socket)的例子,這里也是通過一個pool限制資源的使用。當每個請求來的時候通過spawn_n方法把對這個請求的handle方法放到獨立的協程中去處理。而handle中的recv這些方法都是被綠化過的,所以如果讀取不到數據這些方法就會把cpu時間交出來給別的協程使用,eventlet還有一個衍生品gevent,先看看例子:
上面是官方的例子,gevent是一個基于libev的python并發框架,以微線程greenlet為核心,使用了epoll事件監聽機制以及諸多其他優化而變得高效.而且其中有個monkey類, 將現有基于Python線程直接轉化為greenlet(類似于打patch)。
我自己測試了下,無論是eventlet寫的uds還是gevent寫的udpserver 并發達到2000時,cpu大概占用到30%左右,性能比之前降了2/3,效果還是很顯著的,不過這個還是沒有達到理想效果,后期準備嘗試下日志的方式,應該會比現在更省資源,就怕磁盤受不了,更何況我們用的還是所謂的云主機~
-
優化
+關注
關注
0文章
220瀏覽量
23928 -
python
+關注
關注
56文章
4798瀏覽量
84810
原文標題:榨干python性能之服務優化
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論