openresty 併發處理mysql的一些配置
因為是自己除錯著玩,系統環境比較low,只是一個虛擬機器。
要測試併發,首先要將系統能支援的檔案描述符數更改,預設系統是1024。
修改的檔案為/etc/security/limits.conf
在底下增加一行* - nofile 100000
重啟系統。執行ulimit -n,看到結果是100000。
如果只是臨時想更改檔案描述符數,只需要執行ulimit -n 100000,這樣只會在當前終端上生效。
修改好檔案描述符後,做併發5000的測試,發現nginx報錯,報錯內容為worker connections not enough,上網查詢結果是在
nginx.conf的events中,修改配置worker_connections 1024 ,將1024改為20000。
在配置檔案的最外層增加配置worker_rlimit_nofile 100000;
要併發,肯定要用到連線池。openresty 的mysql庫自帶了連線池API。
local pool_max_idle_time = 20000 --ms
local pool_size = 200--connections
local ok, err = db:set_keepalive(pool_max_idle_time, pool_size)
設定連線池的數量為200,20秒後沒有連線則釋放此連線。
這時做併發測試,還是會報錯,說mysql 連線數超出,無法連線。
要去修改mysql的配置,預設連線數為100。
修改路徑為/etc/mysql/my.cnf
修改max_connections 欄位
最後再次測試,發現還是報錯,報錯內容為lua tcp read timeout ,conn't connect mysql 。
經排查是寫lua 的時候,new mysql後,有個 db:set_timeout(1000),之前設定位1秒,因為是虛擬機器,磁碟IO比較慢,併發處理
資料會慢一些,導致超時,將這個時間改大一些就好了。