[erlang] http 高并發(fā)下的瓶頸

前言

之前有提到過高并發(fā)情況下對程序性能進行測試。事實證明,日志雖然影響很大,但是httpc請求的影響更大。一旦使用一次httpc請求,性能里面降低到空跑的1/10不到,兩次則再降低一半左右,到最后性能真是一個大寫的慘。

解決方案

開始我沒找到httpc模塊的瓶頸在哪,在指導下手寫了使用gen_tcp進行的整個http請求過程。后續(xù),我偶爾翻到一篇文章 http://www.itdecent.cn/p/e325d6f2efd6,然后在其中的方法指導下進行了優(yōu)化(畢竟人家的方法肯定比我的坑少)。
首先是啟動模塊 _app.erl 里,添加下面的語句

  lists:foreach(fun(X) ->
    httpc_profile_sup:start_child([{profile, X}]) end, 
       [http1, http2, http3, http4, http5, http6, http7, http8, http9])

這樣寫可以添加9個 Profile,用 lists:foreach 寫的原因是一次只能添加一個,后續(xù)的會被省略,所以就添加9次。

添加完成的使用方式

Profile = lists:nth(rand:uniform(9), 
    [http1, http2, http3, http4, http5, http6, http7, http8, http9]),
httpc:request(
    post, 
    {Url, Headers, ContentType, Body}, 
    [],
    [{body_format, binary}],
    Profile)

這里是簡便地實現(xiàn)了下profile的選取方法。我們肯定是希望多個profile能夠處理相同數(shù)量的請求,但不是絕對嚴格的相等。實際上,只要每個profile處理的請求差不多,就能較大程度上避免瓶頸的誕生??赡軙懈玫姆椒?,如erlang公平調(diào)度原則使用的方法,這個我暫時就不考慮了。

在這個處理下,性能較不處理的時候提升了三倍左右,勉強可用。如果更多的增加profile的數(shù)量,優(yōu)化效果比較有限,增長約幾個百分點。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容