Redis - 适配全国产操作系统的那些坑
文章目錄
- 概述
- JEMALLOC
- 內(nèi)存碎片
- Redis 中的 Jemalloc
- libatomic 缺失,引起的編譯失敗
- [jemalloc] unsupported system page size
- 擴(kuò)展
- 小結(jié)
概述
簡(jiǎn)明扼要,本文主要分析及解決以下兩個(gè)問(wèn)題
JEMALLOC
我們先看JEMALLOC
JEMALLOC是什么呢?
github: https://github.com/jemalloc/jemalloc
jemalloc is a general purpose malloc(3) implementation that emphasizes fragmentation avoidance and scalable concurrency support通俗來(lái)說(shuō),也是內(nèi)存管理算法, 但是在避免內(nèi)存碎片與并發(fā)擴(kuò)展要好
內(nèi)存分配器ptmalloc,jemalloc,tcmalloc調(diào)研與對(duì)比
內(nèi)存碎片
既然在jemalloc避免內(nèi)存碎片與并發(fā)擴(kuò)展要好, 那什么是內(nèi)存碎片呢?
假設(shè)一個(gè)簡(jiǎn)單的玩具示例,你有10個(gè)字節(jié)的內(nèi)存:
| | | | | | | | | | |0 1 2 3 4 5 6 7 8 9現(xiàn)在讓我們分配三個(gè)三字節(jié)塊,名稱A,B和C:
| A | A | A | B | B | B | C | C | C | |0 1 2 3 4 5 6 7 8 9現(xiàn)在解除分配塊B:
| A | A | A | | | | C | C | C | |0 1 2 3 4 5 6 7 8 9現(xiàn)在如果我們嘗試分配一個(gè)四字節(jié)的塊D會(huì)發(fā)生什么?
雖然內(nèi)存空間里有四個(gè)字節(jié)的內(nèi)存空閑,但沒(méi)有四個(gè)連續(xù)的內(nèi)存字節(jié),所以不能分配D!同時(shí),也不能移動(dòng)C來(lái)騰出空間,因?yàn)槌绦蛑械哪承┳兞亢芸赡苤赶駽,所以我們無(wú)法自動(dòng)查找和更改所有這些值。
Redis 中的 Jemalloc
Redis在2.4及2.4以后的版本中,內(nèi)存管理默認(rèn)使用Facebook開源的jemalloc
我們從源碼中的Makefile文件可以看到
如果是Linux操作系統(tǒng),且沒(méi)有強(qiáng)制使用GLIBC , 則使用JEMALLOC
你如果找2.4.0之前版本的MakeFile ,是沒(méi)有這個(gè)邏輯的。
libatomic 缺失,引起的編譯失敗
運(yùn)行時(shí)動(dòng)態(tài)庫(kù)的搜索路徑的先后順序是:
- 1)編譯目標(biāo)代碼時(shí)指定的動(dòng)態(tài)庫(kù)搜索路徑;
- 2)環(huán)境變量LD_LIBRARY_PATH指定的動(dòng)態(tài)庫(kù)搜索路徑;
- 3)配置文件/etc/ld.so.conf中指定的動(dòng)態(tài)庫(kù)搜索路徑;
- 4)默認(rèn)的動(dòng)態(tài)庫(kù)搜索路徑/lib和/usr/lib;
5.0.8 及 5.0.8以后的版本中,redis源碼中的Makefile ,增加了這么一段邏輯
ARM架構(gòu)(V8 ,V6)下 ,使用libatomic。
那怎么解決呢?
如果必須使用,則需要將對(duì)應(yīng)的 rpm包安裝以后, /usr/lib64建立軟連接
然后,make distclean 后再 make
5.0.7 及 5.0.7 一下版本,未使用到
[jemalloc] unsupported system page size
3個(gè)常見的頁(yè)大小
- 4096 4k
- 16384 16K
- 65536 64k
4K環(huán)境上編譯的,無(wú)法在16和64上運(yùn)行,
反之可以。
為避免出問(wèn)題,建議統(tǒng)一在64K的 機(jī)器上編譯
getconf PAGESIZE 可查看頁(yè)大小
擴(kuò)展
Google TCMalloc:Thread-Caching Malloc
https://github.com/google/tcmalloc
小結(jié)
- 作為基礎(chǔ)庫(kù)的ptmalloc是最為穩(wěn)定的內(nèi)存管理器,無(wú)論在什么環(huán)境下都能適應(yīng),但是分配效率相對(duì)較低。
- tcmalloc針對(duì)多核情況有所優(yōu)化,性能有所提高,但是內(nèi)存占用稍高,大內(nèi)存分配容易出現(xiàn)CPU飆升。
- jemalloc的內(nèi)存占用更高,但是在多核多線程下的表現(xiàn)也最為優(yōu)異。
總結(jié)
以上是生活随笔為你收集整理的Redis - 适配全国产操作系统的那些坑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SimCSE构造正负样本对与损失
- 下一篇: 2020资料员-岗位技能(资料员)模拟考