您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Java大型中間件系統(tǒng)中須調(diào)整的Linux內(nèi)核參數(shù)有哪些,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
作為Java開發(fā)者,必可避免的需要開發(fā)或使用一些中間件,對(duì)于Java開發(fā)的中間件,除了JVM參數(shù)必須調(diào)整外,
Linux的一些內(nèi)核參數(shù)也必須要調(diào)整。 |
無非都是跟磁盤文件IO、網(wǎng)絡(luò)通信、內(nèi)存管理、線程數(shù)量有關(guān)系的,因?yàn)槲覀兊闹虚g件系統(tǒng)在運(yùn)行的時(shí)候無非就是跟這些打交道。
vm.overcommit_memory
這個(gè)參數(shù)有三個(gè)值可以選擇,0、1、2。
如果值是0的話,在你的中間件系統(tǒng)申請(qǐng)內(nèi)存的時(shí)候,操作系統(tǒng)內(nèi)核會(huì)檢查可用內(nèi)存是否足夠,如果足夠的話就分配內(nèi)存給你,如果感覺剩余內(nèi)存不是太夠了,干脆就拒絕你的申請(qǐng),導(dǎo)致你申請(qǐng)內(nèi)存失敗,進(jìn)而導(dǎo)致中間件系統(tǒng)異常出錯(cuò)。因此一般需要將這個(gè)參數(shù)的值調(diào)整為1,意思是把所有可用的物理內(nèi)存都允許分配給你,只要有內(nèi)存就給你來用,這樣可以避免申請(qǐng)內(nèi)存失敗的問題。
比如我們?cè)?jīng)線上環(huán)境部署的Redis就因?yàn)檫@個(gè)參數(shù)是0,導(dǎo)致在save數(shù)據(jù)快照到磁盤文件的時(shí)候,需要申請(qǐng)大內(nèi)存的時(shí)候被拒絕了,進(jìn)而導(dǎo)致了異常報(bào)錯(cuò)。
可以用如下 命令修改:
echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
vm.max_map_count
這個(gè)參數(shù)的值會(huì)影響中間件系統(tǒng)可以開啟的線程的數(shù)量,同樣也是非常重要的。
如果這個(gè)參數(shù)過小,有的時(shí)候可能會(huì)導(dǎo)致有些中間件無法開啟足夠的線程,進(jìn)而導(dǎo)致報(bào)錯(cuò),甚至中間件系統(tǒng)掛掉。
他的默認(rèn)值是65536,但是這個(gè)值有時(shí)候是不夠的,比如我們大數(shù)據(jù)團(tuán)隊(duì)的生產(chǎn)環(huán)境部署的Kafka集群曾經(jīng)有一次就報(bào)出過這個(gè)異常,說無法開啟足夠多的線程,直接導(dǎo)致Kafka宕機(jī)了。
可以用如下 命令修改:
echo 'vm.max_map_count=655360' >> /etc/sysctl.conf
vm.swappiness
這個(gè)參數(shù)是用來控制進(jìn)程的swap行為的,這個(gè)簡單來說就是操作系統(tǒng)會(huì)把一部分磁盤空間作為swap區(qū)域,然后如果有的進(jìn)程現(xiàn)在可能不是太活躍,就會(huì)被操作系統(tǒng)把進(jìn)程調(diào)整為睡眠狀態(tài),把進(jìn)程中的數(shù)據(jù)放入磁盤上的swap區(qū)域,然后讓這個(gè)進(jìn)程把原來占用的內(nèi)存空間騰出來,交給其他活躍運(yùn)行的進(jìn)程來使用。
如果這個(gè)參數(shù)的值設(shè)置為0,意思就是盡量別把任何一個(gè)進(jìn)程放到磁盤swap區(qū)域去,盡量大家都用物理內(nèi)存。
如果這個(gè)參數(shù)的值是100,那么意思就是盡量把一些進(jìn)程給放到磁盤swap區(qū)域去,內(nèi)存騰出來給活躍的進(jìn)程使用。
默認(rèn)這個(gè)參數(shù)的值是60,有點(diǎn)偏高了,可能會(huì)導(dǎo)致我們的中間件運(yùn)行不活躍的時(shí)候被迫騰出內(nèi)存空間然后放磁盤swap區(qū)域去。因此通常在生產(chǎn)環(huán)境建議把這個(gè)參數(shù)調(diào)整小一些,比如設(shè)置為10,盡量用物理內(nèi)存,別放磁盤swap區(qū)域去。
可以用如下命令修改:
echo 'vm.swappiness=10' >> /etc/sysctl.conf
ulimit
這個(gè)是用來控制linux上的最大文件連接數(shù)的,默認(rèn)值可能是1024,一般肯定是不夠的,因?yàn)槟阍诖罅款l繁的讀寫磁盤文件的時(shí)候,或者是進(jìn)行網(wǎng)絡(luò)通信的時(shí)候,都會(huì)跟這個(gè)參數(shù)有關(guān)系
對(duì)于一個(gè)中間件系統(tǒng)而言肯定是不能使用默認(rèn)值得,如果你采用默認(rèn)值,很可能在線上會(huì)出現(xiàn)如下錯(cuò)誤:
error: too many open files
因此通常建議用如下命令修改這個(gè)值:
echo 'ulimit -n 1000000' >> /etc/profile
一點(diǎn)小小的總結(jié)
中間件系統(tǒng)肯定要開啟大量的線程(跟vm.max_map_count有關(guān))。
而且要進(jìn)行大量的網(wǎng)絡(luò)通信和磁盤IO(跟ulimit有關(guān))。
然后大量的使用內(nèi)存(跟vm.swappiness和vm.overcommit_memory有關(guān))。
所以對(duì)OS內(nèi)核參數(shù)的調(diào)整,往往也就是圍繞跟中間件系統(tǒng)運(yùn)行最相關(guān)的一些東西。
關(guān)于Java大型中間件系統(tǒng)中須調(diào)整的Linux內(nèi)核參數(shù)有哪些就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。