java 连接redis_Redis 开发陷阱及避坑指南!
Java技術(shù)棧
www.javastack.cn
關(guān)注優(yōu)質(zhì)文章
原文首發(fā)于博客園,作者:后青春期的Keats地址:https://www.cnblogs.com/keatsCoder/Linux 配置優(yōu)化
我們?cè)谑褂?Redis?過(guò)程中,可能更多的關(guān)注 Redis 本身的一些配置優(yōu)化,如 AOF、RDB 配置、數(shù)據(jù)結(jié)構(gòu)配置優(yōu)化等。
但是很少關(guān)心 Redis?的載體,服務(wù)器的優(yōu)化。而這往往為我們的項(xiàng)目運(yùn)行帶來(lái)災(zāi)難性的打擊。因此服務(wù)器優(yōu)化也是必不可少的。
內(nèi)存分配控制
Redis?啟動(dòng)時(shí),可能會(huì)出現(xiàn)下面的日志
#?WARNING?overcommit_memory?is?set?to?0!?Background?save?may?fail?under?low?memory?condition.?To?fix?this?issue?add?'vm.overcommit\_memory?=?1'?to?/etc/sysctl.conf?and?then?reboot?or?run?the?command?'sysctl?vm.overcommit_memory=1'?for?this?to?take?effect.overcommit 是 Linux 的一種內(nèi)存處理機(jī)制:Linux 對(duì)絕大多數(shù)內(nèi)存申請(qǐng)都會(huì)回復(fù) yes,以便運(yùn)行更多的程序。因?yàn)樯暾?qǐng)內(nèi)存后,并不會(huì)馬上使用內(nèi)存。這種機(jī)制就是 overcommit 。
而 overcommit_memory 是用來(lái)設(shè)置內(nèi)存分配策略的,有三種取值
| 0 | 內(nèi)核檢查是否有足夠可用內(nèi)存,有則通過(guò)。沒(méi)有則申請(qǐng)失敗,并返回錯(cuò)誤給進(jìn)程 |
| 1 | 表示內(nèi)核允許超量使用內(nèi)存直到用完為止 |
| 2 | 表示內(nèi)核絕不過(guò)量的使用內(nèi)存 |
日志中 Background save 指的是 bgsave 和 bgrewriteaof 。根據(jù)操作系統(tǒng)的配置,如果 overcommit_memory 設(shè)置為 0 則可能會(huì)造成內(nèi)存申請(qǐng)失敗而導(dǎo)致后臺(tái)持久化失敗。
因此 Redis?建議將這個(gè)值設(shè)置為 1 是為了 fork 操作在低內(nèi)存下也能執(zhí)行成功。
設(shè)置方法
通過(guò)命令修改,立即生效。重啟后會(huì)失效sysctl?vm.overcommit_memory=1再將改動(dòng)寫入系統(tǒng)配置文件,使其永久有效
echo?"vm.overcommit_memory=1"?>>?/etc/sysctl.conf建議
采用 Redis?建議的配置是為了在極端情況下 Linux 可以擠出來(lái)一些內(nèi)存供 Redis?備份,但是更建議優(yōu)先配置好 maxmemory ,給機(jī)器留 20%~30% 的空閑內(nèi)存。硬盤虛擬內(nèi)存
swap 是指當(dāng)物理內(nèi)存不足時(shí),拿出部分硬盤空間當(dāng) SWAP 分區(qū)(虛擬成內(nèi)存)使用。我們都知道硬盤的讀寫速度相對(duì)于內(nèi)存實(shí)在是太雞肋,對(duì)于高并發(fā)、高吞吐的應(yīng)用來(lái)說(shuō),磁盤IO通長(zhǎng)會(huì)成為系統(tǒng)瓶頸。Linux 系統(tǒng)中 swappiness 的值控制操作系統(tǒng)使用 swap 的傾向程度。
查看內(nèi)核版本:
uname?-sr| 0 | 內(nèi)核版本 3.5 及以上 寧愿使用 OOM Killer 也不使用 SWAP;內(nèi)核版本 3.4 及更早則反之 |
| 1 | 內(nèi)核版本 3.5 及以上 寧愿使用 OOM Killer 也不使用 SWAP |
| 60 | 默認(rèn)值 |
| 主動(dòng)使用 SWAP |
PS:OOM Killer 是指當(dāng) Linux 發(fā)現(xiàn)操作系統(tǒng)內(nèi)存不足時(shí),主動(dòng)殺死一些非內(nèi)核進(jìn)程的操作
設(shè)置方法
echo {value} > /proc/sys/vm/swappinessecho vm.swappiness={value} >> etc/sysctl.conf
監(jiān)控swap
查看 Swap 的總體情況
free?-m最后一行即展示了 Swap 的使用情況,一共 2047 Mb,以使用 0 Mb,空閑 2047 Mb
實(shí)時(shí)查看 Swap 的使用
參數(shù) si 表示 swap in ,so 表示 swap out 在我的機(jī)器上都是 0 表示沒(méi)有使用交換
查看指定進(jìn)程的 Swap 情況
通過(guò) ps -ef |grep redis 查看 Redis? 進(jìn)程號(hào),例如 1621
通過(guò) cat /proc/1621/smaps | grep Swap 命令查看每個(gè)內(nèi)存塊 Redis Swap 的使用情況
THP 內(nèi)存頁(yè)大小
Redis?啟動(dòng)時(shí)可能會(huì)看到下面的日志
WARNING?you?have?Transparent?Huge?Pages?(THP)?support?enabled?in?your?kernel.?This?will?create?latency?and?memory?usage?issues?with?Redis.?To?fix?this?issue?run?the?command?'echo?never?>?/sys/kernel/mm/transparent_hugepage/enabled'?as?root,?and?add?it?to?your?/etc/rc.local?in?order?to?retain?the?setting?after?a?reboot.?Redis?must?be?restarted?after?THP?is?disabled.提示告訴我們建議修改 Transparent Huge Pages (THP) 的配置,Linux kernel 在 2.6.38 內(nèi)核增加了 THP 特性,支持大內(nèi)存頁(yè)(2MB)分配,默認(rèn)開(kāi)啟。
開(kāi)啟后可加快 fork 子進(jìn)程的速度,但是 fork 操作后,每個(gè)內(nèi)存頁(yè)從原來(lái)的 4KB 變?yōu)?2MB,會(huì)大幅加重重寫期間父進(jìn)程內(nèi)存消耗。
同時(shí)每次寫命令引起的復(fù)制內(nèi)存頁(yè)單位放大了512倍。會(huì)拖慢寫操作的執(zhí)行時(shí)間。造成大量的寫操作慢查詢因此 Redis?日志中建議禁用它。另外關(guān)注Java技術(shù)棧公眾號(hào)在后臺(tái)回復(fù)面試可以獲取一份面試題大全。
方法如下:
echo?never?>?/sys/kernel/mm/transparent_hugepage/enabled另外在 /etc/rc.local 中追加
echo?never?>?/sys/kernel/mm/transparent_hugepage/enabled對(duì)于某些發(fā)行版本(例如紅帽6以上)配置文件不在這個(gè)位置(在 /sys/kernel/mm/redhat_transparent_hugepage/enabled),但是 Redis 檢查 THP 是寫死的此位置,所以雖然這么修改后 Redis?不報(bào)警然而實(shí)際是沒(méi)有作用的,需要注意。應(yīng)該改動(dòng)對(duì)應(yīng)位置的值
使用NTP 同步時(shí)間
在集群或哨兵環(huán)境中,多臺(tái)服務(wù)器使用相同的網(wǎng)絡(luò)時(shí)間協(xié)議同步時(shí)間能更方便的閱讀日志,排查問(wèn)題
可以設(shè)置定時(shí)任務(wù)同步時(shí)間
crontab?-u?//設(shè)定某個(gè)用戶的cron服務(wù)crontab?-l?//列出某個(gè)用戶cron服務(wù)的詳細(xì)內(nèi)容
crontab?-r?//刪除某個(gè)用戶的cron服務(wù)
crontab?-e?//編輯某個(gè)用戶的cron服務(wù)
crontab?-i?//打印提示,輸入yes等確認(rèn)信息
添加每小時(shí)執(zhí)行一次的任務(wù)
0?*?*?*?*?/usr/sbin/ntpdate?cn.pool.ntp.org?>?dev/null?2>&1最大連接數(shù)限制
通過(guò) ulimit -a 命令查看和設(shè)置當(dāng)前用戶進(jìn)程的資源數(shù),其中包含 open files 參數(shù),是單個(gè)用戶同時(shí)打開(kāi)的最大文件描述符個(gè)數(shù)。雖然 Redis?中可以配置最大的客戶端連接數(shù)(默認(rèn) 10000) 。
Redis?內(nèi)部最多使用 32 個(gè)文件描述符。當(dāng) open files = 4096 時(shí),Redis 最大提供 4096-32=4064 個(gè)連接。因?yàn)樗荒芡黄撇僮飨到y(tǒng)的限制。如果需要,使用如下命令修改:
ulimit?-Sn?{max-open-files}TCP backlog
tcp backlog 配置的是 tcp 握手時(shí)候的隊(duì)列大小。如果該值過(guò)小。會(huì)導(dǎo)致高并發(fā)場(chǎng)景下部分連接第三次握手ACK被丟棄。關(guān)于 backlog
The?TCP?backlog?setting?of?511?cannot?be?enforced?because?/proc/sys/net/core/somaxconn?is?set?to?the?lower?value?of?128.Redis?啟動(dòng)時(shí),會(huì)告訴我們系統(tǒng)配置中該值是 128,而 Redis 511。這個(gè) 511 是沒(méi)用的,因?yàn)橄到y(tǒng)比這個(gè)小。需要修改系統(tǒng) backlog 的值。
echo?511?>?/proc/sys/net/core/somaxconn參考文獻(xiàn):
《Redis開(kāi)發(fā)與運(yùn)維》 --- 付 磊 張益軍
最近熱文:
1、重磅!《Java開(kāi)發(fā)手冊(cè)(嵩山版)》最新發(fā)布
2、打破你的認(rèn)知!Java空指針居然還能這樣玩
3、吊打 Tomcat ,Undertow 性能很炸!!
4、Spring Boot 太狠了,一次發(fā)布 3 個(gè)版本!
5、Spring Boot 如何快速集成 Redis?
6、盤點(diǎn) 6 個(gè)被淘汰的 Java 技術(shù),曾經(jīng)風(fēng)光過(guò)!
7、Spring Boot Redis 實(shí)現(xiàn)分布式鎖,真香!
8、國(guó)人開(kāi)源了一款小而全的 Java 工具類庫(kù)!
9、國(guó)人開(kāi)源了一款超好用的 Redis 客戶端!!
10、同事寫了個(gè)隱藏 bug,我排查了 3 天!
掃碼關(guān)注Java技術(shù)棧公眾號(hào)干貨。
點(diǎn)擊「」獲取面試題大全~總結(jié)
以上是生活随笔為你收集整理的java 连接redis_Redis 开发陷阱及避坑指南!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java log4j logback j
- 下一篇: java 最少使用(lru)置换算法_一