介紹幾個Java大型中間件系統中須調整的Linux內核參數

作爲Java開發者,必可避免的需要開發或使用一些中間件,對於Java開發的中間件,除了JVM參數必須調整外,Linux的一些內核參數也必須要調整,這裏幾個,僅供參考。

無非都是跟磁盤文件IO、網絡通信、內存管理、線程數量有關係的,因爲我們的中間件系統在運行的時候無非就是跟這些打交道。

介紹幾個Java大型中間件系統中須調整的Linux內核參數介紹幾個Java大型中間件系統中須調整的Linux內核參數

vm.overcommit_memory

這個參數有三個值可以選擇,0、1、2。

如果值是0的話,在你的中間件系統申請內存的時候,操作系統內核會檢查可用內存是否足夠,如果足夠的話就分配內存給你,如果感覺剩餘內存不是太夠了,乾脆就拒絕你的申請,導致你申請內存失敗,進而導致中間件系統異常出錯。因此一般需要將這個參數的值調整爲1,意思是把所有可用的物理內存都允許分配給你,只要有內存就給你來用,這樣可以避免申請內存失敗的問題。

比如我們曾經線上環境部署的Redis就因爲這個參數是0,導致在save數據快照到磁盤文件的時候,需要申請大內存的時候被拒絕了,進而導致了異常報錯。

可以用如下命令修改:

echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
vm.max_map_count

這個參數的值會影響中間件系統可以開啓的線程的數量,同樣也是非常重要的。

如果這個參數過小,有的時候可能會導致有些中間件無法開啓足夠的線程,進而導致報錯,甚至中間件系統掛掉。

他的默認值是65536,但是這個值有時候是不夠的,比如我們大數據團隊的生產環境部署的Kafka集羣曾經有一次就報出過這個異常,說無法開啓足夠多的線程,直接導致Kafka宕機了。

可以用如下命令修改:

echo 'vm.max_map_count=655360' >> /etc/sysctl.conf
vm.swappiness

這個參數是用來控制進程的swap行爲的,這個簡單來說就是操作系統會把一部分磁盤空間作爲swap區域,然後如果有的進程現在可能不是太活躍,就會被操作系統把進程調整爲睡眠狀態,把進程中的數據放入磁盤上的swap區域,然後讓這個進程把原來佔用的內存空間騰出來,交給其他活躍運行的進程來使用。

如果這個參數的值設置爲0,意思就是儘量別把任何一個進程放到磁盤swap區域去,儘量大家都用物理內存。

如果這個參數的值是100,那麼意思就是儘量把一些進程給放到磁盤swap區域去,內存騰出來給活躍的進程使用。

默認這個參數的值是60,有點偏高了,可能會導致我們的中間件運行不活躍的時候被迫騰出內存空間然後放磁盤swap區域去。因此通常在生產環境建議把這個參數調整小一些,比如設置爲10,儘量用物理內存,別放磁盤swap區域去。

可以用如下命令修改:

echo 'vm.swappiness=10' >> /etc/sysctl.conf
ulimit

這個是用來控制linux上的最大文件連接數的,默認值可能是1024,一般肯定是不夠的,因爲你在大量頻繁的讀寫磁盤文件的時候,或者是進行網絡通信的時候,都會跟這個參數有關係

對於一箇中間件系統而言肯定是不能使用默認值得,如果你採用默認值,很可能在線上會出現如下錯誤:

error: too many open files

因此通常建議用如下命令修改這個值:

echo 'ulimit -n 1000000' >> /etc/profile
一點小小的總結

中間件系統肯定要開啓大量的線程(跟vm.max_map_count有關)。

而且要進行大量的網絡通信和磁盤IO(跟ulimit有關)。

然後大量的使用內存(跟vm.swappiness和vm.overcommit_memory有關)。

所以對OS內核參數的調整,往往也就是圍繞跟中間件系統運行最相關的一些東西。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章