Laravel/Lumen搭建服務器性能測試
背景和目的
一個最簡單的服務器,我們至少也要關心服務器的吞吐量、cpu使用率、內存消耗。這篇文章會在上篇文章的基礎上,使用搭建好的環境測試這個幾個基本指標,分析性能瓶頸,給出可能的解決的方法。最終的目的是在服務器環境中測試oss php sdk的性能。
準備
利用上一篇搭建好的環境(參見 https://yq.aliyun.com/articles/173260?spm=5176.8091938.0.0.ZkrjGo ) 我們寫一個最簡單的測試代碼,
#修改routes/web.php為
Route::get('/', function()
{
return "Hello Laravel!\n";
});
這段代碼不和oss有任何交互,隻是接受一個請求然後返回 "Hello Laravel !"
我們簡單測試一下:
沒錯,這樣我們就完成了測試的準備工作。
測試數據
我在自己的macair上用Apache的ab命令模擬多線程並發請求,測試服務器負載壓力,當然你可以采用其他工具。我把Laravel搭建的服務起在一個4核8G的物理機上,對外暴露的域名服務是https://www.test_laravel.com/。
#這條命令代表client端有100個並發、總共5000次請求發給服務器
time ab -c 100 -n 5000 https://www.test_laravel.com/
通過執行結果我們看到5000個簡單返回給用戶"Hello Laravel!"的請求花費20多s.
再看處理請求時服務器的cpu和內存狀況,
可以看出,內存不是瓶頸,但cpu幾乎被吃光。
繼續看在主機cpu耗幹的情況下, 處理請求的QPS,我們通過從nginx的aceess log中來看:
果然不出所料,QPS(最左側一列)低到底褲都沒有。
分析
這樣的結果不敢相信,一開始肯定是覺得自己的姿勢不對,google搜索一下發現幾乎所有人用Laravel的都是這個問題,QPS上不去,php-fpm耗光了cpu。實在不明白Laravel這樣的性能能幹什麼,雖然我的服務器是個4核8G的菜機,但也不至於差成這樣。
如何提高
Laravel 從 5 起已經能算是全棧框架了,從前端到後端,如果你隻是想開發個小項目,可以使用Lumen,這是個為速度而生的Laravel精簡框架,它使用最小的配置集成了所有Laravel的重要特性,適合開發小型項目,我使用Lumen再來測試一次。(Lumen安裝請自己搞定,其實和Laravel幾乎一樣)
OK, 我們使用同樣的姿勢在Lumen上測試,
修改routes/web.php
$app->get('/', function () {
return "Hello Lumenl!\n";
});
我們把Lumen搭建的服務對外暴露的域名定為www.test_lumen.com, 同樣檢查一下環境:
環境OK。
這裏有個插曲,因為我是在自己的macair上執行ab命令模擬並發,發現怎麼都打不滿現在lumen搭建的服務器的cpu,qps也上不去。原因猜測是因為macair性能差無法模擬出這麼多並發,我換了台性能好的機器執行ab命令,問題解決。 因為5000個請求基本1s就處理完了,為便於觀察,我把總請求數調大為50000。
#100個並發、50000次請求
time ab -c 10 -n 50000 https://www.test_laravel.com/
看最左側,現在QPS已經可以打到4500了,巨大的提升。
oss php sdk性能測試
說了這麼多的鋪墊工作,終於到了要測oss php sdk性能的環節了。
我們知道php本身是不支持多線程的,所以oss php sdk是一個線程來上傳下載的,可想而知它性能會有多差。幸運的是,大部分使用php sdk的開發者是把它用在服務器端的,這樣我們就可以借助服務器以一種多進程的方式來測試。
上篇文章我們已經知道如何在laravel/lumen中使用oss php sdk了,現在我們同樣寫一個簡單的和oss交互的測試程序,目標是能通過這個簡單測試程序打滿一個千兆網卡。
我們訪問用lumen搭建的服務,同樣修改routes/web.php
$app->get('/', function () use ($app) {
$client = $app->make('aliyun-oss');
$file_pre = mt_rand(1, 10000);
$file_sec = mt_rand(1, 10000);
$bucket_name = "you_bucket";
$object_name = 'lumen/net' . $file_pre . $file_sec;
$local_file = "/tmp/data100M";
$client->uploadFile($bucket_name, $object_name, $local_file);
return "upload OK!\n";
});
這段代碼邏輯很簡單,服務器收到一個訪問請求後,他就調用oss php sdk向oss上傳一個100M的文件,我們也先不考慮可能出現的異常分支。
我們同樣用ab測試, 但注意不要請求太多,觀察到現象就行(畢竟是要收錢的^-^)。
我起10個並發共20個請求,
time ab -c 10 -n 20 https://www.test_lumen.com/
然後觀察服務器的網卡、cpu、mem信息,
發現網卡已經打滿,
總結
主要測試了laravel/lumen結合oss php sdk搭建最簡單應用的性能,一些原理性的解釋先不在這裏做介紹,以後有機會可以再開篇文章。
最後更新:2017-08-28 09:02:56