新聞中心
作為Java開(kāi)發(fā)者,必可避免的需要開(kāi)發(fā)或使用一些中間件,對(duì)于Java開(kāi)發(fā)的中間件,除了JVM參數(shù)必須調(diào)整外,Linux的一些內(nèi)核參數(shù)也必須要調(diào)整,這里幾個(gè),僅供參考。

創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)伊吾,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18980820575
無(wú)非都是跟磁盤文件IO、網(wǎng)絡(luò)通信、內(nèi)存管理、線程數(shù)量有關(guān)系的,因?yàn)槲覀兊闹虚g件系統(tǒng)在運(yùn)行的時(shí)候無(wú)非就是跟這些打交道。
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)存給你,如果感覺(jué)剩余內(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)存就給你來(lái)用,這樣可以避免申請(qǐng)內(nèi)存失敗的問(wèn)題。
比如我們?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)可以開(kāi)啟的線程的數(shù)量,同樣也是非常重要的。
如果這個(gè)參數(shù)過(guò)小,有的時(shí)候可能會(huì)導(dǎo)致有些中間件無(wú)法開(kāi)啟足夠的線程,進(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)出過(guò)這個(gè)異常,說(shuō)無(wú)法開(kāi)啟足夠多的線程,直接導(dǎo)致Kafka宕機(jī)了。
可以用如下命令修改:
echo 'vm.max_map_count=655360' >> /etc/sysctl.conf
vm.swappiness
這個(gè)參數(shù)是用來(lái)控制進(jìn)程的swap行為的,這個(gè)簡(jiǎn)單來(lái)說(shuō)就是操作系統(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)程把原來(lái)占用的內(nèi)存空間騰出來(lái),交給其他活躍運(yùn)行的進(jìn)程來(lái)使用。
如果這個(gè)參數(shù)的值設(shè)置為0,意思就是盡量別把任何一個(gè)進(jìn)程放到磁盤swap區(qū)域去,盡量大家都用物理內(nèi)存。
如果這個(gè)參數(shù)的值是100,那么意思就是盡量把一些進(jìn)程給放到磁盤swap區(qū)域去,內(nèi)存騰出來(lá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è)是用來(lái)控制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)肯定要開(kāi)啟大量的線程(跟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)的一些東西。
文章標(biāo)題:通過(guò)調(diào)整Linux內(nèi)核參數(shù)才能使用的Java大型中間件系統(tǒng)
文章路徑:http://www.dlmjj.cn/article/cdijcse.html


咨詢
建站咨詢
