介紹幾個Java大型中介軟體系統中須調整的Linux核心引數

大雄45發表於2020-05-13
作為Java開發者,必可避免的需要開發或使用一些中介軟體,對於Java開發的中介軟體,除了JVM引數必須調整外, 的一些核心引數也必須要調整,這裡幾個,僅供參考。

無非都是跟磁碟檔案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核心引數的調整,往往也就是圍繞跟中介軟體系統執行最相關的一些東西。

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2691932/,如需轉載,請註明出處,否則將追究法律責任。

相關文章