原文首發于博客園,作者:后青春期的Keats
地址:https://www.cnblogs.com/keatsCoder/
Linux 配置優化
我們在使用 Redis 程序中,可能更多的關注 Redis 本身的一些配置優化,如 AOF、RDB 配置、資料結構配置優化等,
但是很少關心 Redis 的載體,服務器的優化,而這往往為我們的專案運行帶來災難性的打擊,因此服務器優化也是必不可少的,
記憶體分配控制
Redis 啟動時,可能會出現下面的日志
# 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 的一種記憶體處理機制:Linux 對絕大多數記憶體申請都會回復 yes,以便運行更多的程式,因為申請記憶體后,并不會馬上使用記憶體,這種機制就是 overcommit ,
而 overcommit_memory 是用來設定記憶體分配策略的,有三種取值

日志中 Background save 指的是 bgsave 和 bgrewriteaof ,根據作業系統的配置,如果 overcommit_memory 設定為 0 則可能會造成記憶體申請失敗而導致后臺持久化失敗,
因此 Redis 建議將這個值設定為 1 是為了 fork 操作在低記憶體下也能執行成功,
設定方法
通過命令修改,立即生效,重啟后會失效
sysctl vm.overcommit_memory=1
再將改動寫入系統組態檔,使其永久有效
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
建議
采用 Redis 建議的配置是為了在極端情況下 Linux 可以擠出來一些記憶體供 Redis 備份,但是更建議優先配置好 maxmemory ,給機器留 20%~30% 的空閑記憶體,
硬碟虛擬記憶體
swap 是指當物理記憶體不足時,拿出部分硬碟空間當 SWAP 磁區(虛擬成記憶體)使用,我們都知道硬碟的讀寫速度相對于記憶體實在是太雞肋,對于高并發、高吞吐的應用來說,磁盤IO通長會成為系統瓶頸,Linux 系統中 swappiness 的值控制作業系統使用 swap 的傾向程度,
查看內核版本:
uname -sr

主動使用 SWAP
PS:OOM Killer 是指當 Linux 發現作業系統記憶體不足時,主動殺死一些非內核行程的操作
設定方法
echo {value} > /proc/sys/vm/swappiness
echo vm.swappiness={value} >> etc/sysctl.conf
監控swap
查看 Swap 的總體情況
free -m

最后一行即展示了 Swap 的使用情況,一共 2047 Mb,以使用 0 Mb,空閑 2047 Mb
實時查看 Swap 的使用

引數 si 表示 swap in ,so 表示 swap out 在我的機器上都是 0 表示沒有使用交換
查看指定行程的 Swap 情況
通過 ps -ef |grep redis 查看 Redis 行程號,例如 1621
通過 cat /proc/1621/smaps | grep Swap 命令查看每個記憶體塊 Redis Swap 的使用情況
THP 記憶體頁大小
Redis 啟動時可能會看到下面的日志
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 內核增加了 THP 特性,支持大記憶體頁(2MB)分配,默認開啟,
開啟后可加快 fork 子行程的速度,但是 fork 操作后,每個記憶體頁從原來的 4KB 變為 2MB,會大幅加重重寫期間父行程記憶體消耗,
同時每次寫命令引起的復制記憶體頁單位放大了512倍,會拖慢寫操作的執行時間,造成大量的寫操作慢查詢因此 Redis日志中建議禁用它,另外關注Java技術堆疊公眾號在后臺回復面試可以獲取一份面試題大全,
方法如下:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
另外在 /etc/rc.local 中追加
echo never > /sys/kernel/mm/transparent_hugepage/enabled
對于某些發行版本(例如紅帽6以上)組態檔不在這個位置(在 /sys/kernel/mm/redhat_transparent_hugepage/enabled),但是 Redis 檢查 THP 是寫死的此位置,所以雖然這么修改后 Redis不報警然而實際是沒有作用的,需要注意,應該改動對應位置的值
使用NTP 同步時間
在集群或哨兵環境中,多臺服務器使用相同的網路時間協議同步時間能更方便的閱讀日志,排查問題
可以設定定時任務同步時間
crontab -u //設定某個用戶的cron服務
crontab -l //列出某個用戶cron服務的詳細內容
crontab -r //洗掉某個用戶的cron服務
crontab -e //編輯某個用戶的cron服務
crontab -i //列印提示,輸入yes等確認資訊
添加每小時執行一次的任務
0 * * * * /usr/sbin/ntpdate cn.pool.ntp.org > dev/null 2>&1
最大連接數限制
通過 ulimit -a 命令查看和設定當前用戶行程的資源數,其中包含 open files 引數,是單個用戶同時打開的最大檔案描述符個數,雖然 Redis 中可以配置最大的客戶端連接數(默認 10000) ,
Redis 內部最多使用 32 個檔案描述符,當 open files = 4096 時,Redis 最大提供 4096-32=4064 個連接,因為它不能突破作業系統的限制,如果需要,使用如下命令修改:
ulimit -Sn {max-open-files}
TCP backlog
tcp backlog 配置的是 tcp 握手時候的佇列大小,如果該值過小,會導致高并發場景下部分連接第三次握手ACK被丟棄,關于 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啟動時,會告訴我們系統配置中該值是 128,而 Redis 511,這個 511 是沒用的,因為系統比這個小,需要修改系統 backlog 的值,
echo 511 > /proc/sys/net/core/somaxconn
參考文獻:
《Redis開發與運維》 --- 付 磊 張益軍
近期熱文推薦:
1.Java 15 正式發布, 14 個新特性,重繪你的認知!!
2.終于靠開源專案弄到 IntelliJ IDEA 激活碼了,真香!
3.我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看,,
4.吊打 Tomcat ,Undertow 性能很炸!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/173985.html
標籤:其他
