前言
之前有提到過高并發(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)化效果比較有限,增長約幾個百分點。