1. 程式人生 > >使用阿里雲NAS做PHP共享session的坑

使用阿里雲NAS做PHP共享session的坑

使用阿里雲NAS做PHP共享session的坑
 
專案上線後,發現負載均衡下的每臺web伺服器負載均很高,但是CPU利用率確是不高。因為web程式碼是PHP開發的,從CPU利用率看出來程式碼應該沒有什麼問題,極有可能是由於IO等待導致每個php執行時間太長,導致任務堆積。
然後開啟PHP的慢日誌,問題就清楚了,原來效能卡在session上。 

script_filename = /data0/www/***/public/index.php
[0x00007f2543d5abd8] flock() /data0/www/***/public/system/libraries/Session/drivers/Session_files_driver.php:178
[0x00007ffe9a3ebee0] read() unknown:0
[0x00007f2543d5a338] session_start() /data0/www/***/public/system/libraries/Session/Session.php:143
[0x00007f2543d591d8] __construct() /data0/www/***/public/system/core/Loader.php:1285
[0x00007f2543d58208] _ci_init_library() /data0/www/***/public/system/core/Loader.php:1178
[0x00007f2543d57728] _ci_load_stock_library() /data0/www/***/public/system/core/Loader.php:1043
[0x00007f2543d56dd0] _ci_load_library() /data0/www/***/public/system/core/Loader.php:1089
[0x00007f2543d564a8] _ci_load_library() /data0/www/***/public/system/core/Loader.php:218
[0x00007f2543d560e8] library() /data0/www/***/public/system/core/Loader.php:202
[0x00007f2543d55d50] library() /data0/www/***/public/system/core/Loader.php:1359
[0x00007f2543d553c0] _ci_autoloader() /data0/www/***/public/system/core/Loader.php:157
[0x00007f2543d55290] initialize() /data0/www/***/public/system/core/Controller.php:79
[0x00007f2543d54f60] __construct() /data0/www/***/public/application/controllers/api/Home.php:15
[0x00007f2543d54c70] __construct() /data0/www/***/public/system/core/CodeIgniter.php:518
[0x00007f2543d524a8] +++ dump failed

NAS相對於本地磁碟,還多了一層網路通訊,因此效能會比本地磁碟更慢。
OK,共享session除了利用NFS進行檔案共享的方式外,還可以使用memcache和redis,後來我們使用redis作為共享session,問題解決。雖然redis也是需要通過網路,但是最終資料寫入記憶體,這個時間比落入磁碟不是同一個數量級。

不過,由於CI3是自己實現的檔案session方式,主要慢在對session進行flock,以及gc刪除過期session上(遍歷session目錄,然後刪除過期檔案)。那麼對php session是否有影響呢?
參考了php官方的文件:原生的session是有鎖和gc機制的。

後記:
按照阿里雲對NAS檔案系統的產品文件介紹,效能型的ssd應該不會出現IO瓶頸才對。而且在NAS的監控看到IOPS其實並不高
後來在看到這個說明:https://help.aliyun.com/knowledge_detail/53839.html?spm=a2c4g.11186623.4.7.jXaKcm


總結:
雖然最後找到NFS做共享session慢的原因,但是NFS也不適合做共享session,最好還是通過memcache和redis來實現。NFS最好用FTP或下載盤使用,這種使用率不