概述
MongoDB 是一個(gè)流行的面向文檔的,跨平臺(tái)開(kāi)源 NoSQL 數(shù)據(jù)庫(kù)。其靈活的數(shù)據(jù)模型能支持存儲(chǔ)具有完整索引支持和復(fù)制的非結(jié)構(gòu)化數(shù)據(jù)。根據(jù) DB-Engines 的數(shù)據(jù),截至 2023 年 1 月,MongoDB 是第五大最受歡迎的數(shù)據(jù)庫(kù)。它是用 c++ 編寫(xiě)的,旨在為 web 應(yīng)用程序提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
本指南的目的是描述在 AmpereAltra處理器上以最佳方式運(yùn)行 MongoDB 的一些技術(shù)參考。
01構(gòu)建先決條件
以高性能方式運(yùn)行應(yīng)用程序首先要正確構(gòu)建應(yīng)用程序并使用適當(dāng)?shù)木幾g器標(biāo)志。當(dāng)在 AmpereAltra處理器上從源碼開(kāi)始構(gòu)建并運(yùn)行應(yīng)用程序時(shí),我們建議使用 GCC 編譯器版本 10 或更高的版本。較新版本的編譯器往往對(duì)新的處理器特性有更好的支持,并結(jié)合了更高級(jí)的代碼生成技術(shù)。
我們的測(cè)試使用 CentOS Stream 8 作為操作系統(tǒng)。
從 SCL 存儲(chǔ)庫(kù)下載并安裝了 GCC 11:
yum -y install scl-utils scl-utils-build yum -y install gcc-toolset-11.aarch64 scl enable gcc-toolset-11 bash
對(duì)于 Ubuntu 22.04 LTS 和 Debian 等其他操作系統(tǒng),GCC 11 也是可用的,可以直接從各自的存儲(chǔ)庫(kù)安裝。
02構(gòu)建和安裝
MongoDB 可以從操作系統(tǒng)包管理器提供的存儲(chǔ)庫(kù)中安裝,也可以直接從源代碼構(gòu)建。全面的 MongoDB 安裝指南可以在官方文檔中找到。我們建議從源代碼安裝,以獲得更好的靈活性,以及控制和配置特定模塊的能力。
為了構(gòu)建針對(duì) AmpereAltra處理器家族優(yōu)化的 MongoDB,可以在編譯階段添加可以利用硬件特性的額外編譯選項(xiàng)。用于編譯的 MongoDB 源代碼可以從 MongoDB 下載頁(yè)面獲得。本指南使用穩(wěn)定版本 MongoDB 6.0.3。從源代碼安裝需要某些庫(kù)和附加模塊,它們將被編譯成二進(jìn)制文件。
MongoDB 安裝指南:https://github.com/mongodb/mongo/blob/master/docs/building.md
MongoDB 下載頁(yè)面:
https://github.com/mongodb/mongo
執(zhí)行以下步驟來(lái)安裝依賴項(xiàng)。
yum -y install libcurl-devel python39 python39-devel openssl-devel yum -y install zlib-devel git wget xz-devel yum -y groupinstall "Development Tools"
要支持 https 連接,請(qǐng)從各自的 git 存儲(chǔ)庫(kù)下載這些附加源代碼的最新代碼。
git clone [https://github.com/mongodb/mongo](https://github.com/mongodb/mongo) git checkout -b myr6.0.3.rc2 r6.0.3-rc2
需要 Python 3.7+,并且必須安裝幾個(gè) Python 模塊,運(yùn)行命令:
python3 -m pip install -r etc/pip/compile-requirements.txt
編譯
diff a/src/mongo/db/stats/counters.h b/src/mongo/db/stats/counters.h 224a225,226 > static_assert(sizeof(decltype(_together)) <= stdx::hardware_constructive_interference_size, > "cache line spill");
python3 buildscripts/scons.py 支持許多編譯選項(xiàng),如 CC, CFLAGS 等。
# get help of scons, such as define CXX=, CC= python3 buildscripts/scons.py -h # Note: configure g++ and gcc path # --force-jobs is CPU core number python3 buildscripts/scons.py --force-jobs=8040 DESTDIR=
MongoDB 配置
在本指南中,MongoDB 被配置為使用 WiredTiger 存儲(chǔ)引擎和 snappy 作為塊和日志壓縮器。請(qǐng)參考附錄中顯示的 mongodb.conf 文件配置服務(wù)器。
#start the server $MongoDB_Install_Dir/bin/mongod --config mongod_conf --storageEngine wiredTiger #stop the server $MongoDB_Install_Dir/bin --config mongod_conf --shutdown
03性能優(yōu)化
有數(shù)百種設(shè)置可以改變 MongoDB 的功能和性能。下面列出的只是一些可以使用的更常見(jiàn)的調(diào)節(jié)變量。推薦參考 MongoDB 文檔了解所有設(shè)置詳情。
cachesizeGB
定義了內(nèi)部使用的緩存最大值,WiredTiger 將其適用于所有數(shù)據(jù)。
增加 cacheSizeGB 可以減少磁盤(pán) io 的影響,提高讀寫(xiě)性能。
使用“db.serverStatus(). wiredtiger”命令檢查“maximum bytes configured”(cacheSizeGB或默認(rèn)設(shè)置配置的最大緩存大小)和“bytes current in the cache”(當(dāng)前緩存中的數(shù)據(jù)大小)。
Eviction 優(yōu)化
當(dāng)應(yīng)用程序接近最大緩存大小時(shí),WiredTiger 開(kāi)始清除,以防止內(nèi)存使用增長(zhǎng)過(guò)大,遵循“最近最少使用”算法。" eviction=(threads_min=X) "是正在運(yùn)行的 WiredTiger Eviction 工作線程的最小數(shù)量,取值必須在 1 到 20 之間。
" eviction=(threads_max=X) "是正在運(yùn)行的WiredTiger Eviction工作線程的最大數(shù)量。取值必須在 1 到 20 之間。這應(yīng)該與 MongoDB 的 threads_min 設(shè)置相匹配。
#get db.adminCommand({getParameter: 1, wiredTigerEngineRuntimeConfig: "eviction"}) { wiredTigerEngineRuntimeConfig: 'eviction=(threads_min=4,threads_max=8)', ok: 1 } #set db.adminCommand({setParameter: 1, wiredTigerEngineRuntimeConfig: "eviction=(threads_min=4,threads_max=8)"})
concurrentTransactions
iredTiger 使用 ticket 來(lái)控制存儲(chǔ)引擎同時(shí)處理的讀/寫(xiě)操作的數(shù)量。默認(rèn)值是 128,在大多數(shù)情況下都很有效的。如果 ticket 降為 0,則后續(xù)所有操作都排隊(duì)等待新的 ticket。長(zhǎng)時(shí)間運(yùn)行的操作可能會(huì)導(dǎo)致可用 ticket 的數(shù)量減少,從而降低系統(tǒng)的并發(fā)性。例如,增加 ticket 的配置值可以增加并發(fā)性。
#讀取當(dāng)前值 db.serverStatus().wiredTiger.concurrentTransactions { write: { out: 0, available: 128, totalTickets: 128 }, read: { out: 0, available: 128, totalTickets: 128 } } #修改值 db.adminCommand({setParameter: 1, wiredTigerConcurrentWriteTransactions: 256}) { was: 0, ok: 1 } db.adminCommand({setParameter: 1, wiredTigerConcurrentReadTransactions: 256}) { was: 0, ok: 1 }
journalCompressor
指定用于壓縮 WiredTiger 日志數(shù)據(jù)的壓縮類(lèi)型。壓縮操作會(huì)消耗額外的 CPU 資源,但也最小化了存儲(chǔ)消耗。
blockCompressor
指定集合數(shù)據(jù)的默認(rèn)壓縮。在創(chuàng)建集合時(shí),可以在每個(gè)集合的基礎(chǔ)上重置此設(shè)置。當(dāng)然壓縮操作會(huì)消耗額外的 CPU 資源,但也最小化了存儲(chǔ)消耗。
64K PAGESIZE
內(nèi)核 PAGESIZE 建議設(shè)置為 64K。可以使用命令“getconf PAGESIZE”來(lái)確定。PAGESIZE 是一個(gè)內(nèi)存頁(yè)的大小,以字節(jié)為單位,在編譯內(nèi)核時(shí)配置。使用較大的頁(yè)面可以減少將虛擬頁(yè)面地址轉(zhuǎn)換為物理頁(yè)面地址的硬件延遲。延遲的減少是由于硬件翻譯緩存(如 translation lookaside buffer,TLB)的效率得到了提高。因?yàn)橛布D(zhuǎn)換緩存只有有限數(shù)量的條目,所以使用更大的頁(yè)面大小會(huì)增加緩存中每個(gè)條目可以轉(zhuǎn)換的虛擬內(nèi)存量。這不但增加了應(yīng)用程序可以訪問(wèn)的內(nèi)存量,而且不會(huì)導(dǎo)致硬件轉(zhuǎn)換延遲。
Transparent Huge Pages
透明大頁(yè)(Transparent Huge Pages, THP)是一種 Linux 內(nèi)存管理系統(tǒng),它通過(guò)使用更大的內(nèi)存頁(yè),減少了在具有大量?jī)?nèi)存的機(jī)器上 TLB(Translation Lookaside Buffer)查找的開(kāi)銷(xiāo)。然而,在啟用 THP 的情況下,數(shù)據(jù)庫(kù)工作負(fù)載通常表現(xiàn)不佳,因?yàn)樗鼈兺哂邢∈瓒沁B續(xù)的內(nèi)存訪問(wèn)模式。在 Linux 上運(yùn)行 MongoDB 時(shí),應(yīng)該禁用 THP 以獲得最佳性能。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
大多數(shù)類(lèi) unix 操作系統(tǒng),包括 Linux 和 macOS,都提供了在每個(gè)進(jìn)程和每個(gè)用戶的基礎(chǔ)上限制和控制系統(tǒng)資源(如線程、文件和網(wǎng)絡(luò)連接)使用的方法。這些“限制”可以防止單個(gè)用戶使用過(guò)多的系統(tǒng)資源。有時(shí),這些限制的默認(rèn)值比較低,這可能會(huì)在正常的 MongoDB 操作過(guò)程中導(dǎo)致許多問(wèn)題。
要為這些版本配置 ulimit 值,請(qǐng)創(chuàng)建一個(gè)名為?/etc/security/limits.d/99-mongodb-nproc.conf? 的文件,并添加新值以提高該進(jìn)程的限制閾值。
echo "* soft fsize unlimited" | sudo tee -a /etc/security/limits.conf echo "* hard fsize unlimited" | sudo tee -a /etc/security/limits.conf echo "* soft cpu unlimited" | sudo tee -a /etc/security/limits.conf echo "* hard cpu unlimited" | sudo tee -a /etc/security/limits.conf echo "* soft as unlimited" | sudo tee -a /etc/security/limits.conf echo "* hard as unlimited" | sudo tee -a /etc/security/limits.conf echo "* soft memlock unlimited" | sudo tee -a /etc/security/limits.conf echo "* hard memlock unlimited" | sudo tee -a /etc/security/limits.conf echo "* soft nofile 64000" | sudo tee -a /etc/security/limits.conf echo "* hard nofile 64000" | sudo tee -a /etc/security/limits.conf echo "* soft nproc 64000" | sudo tee -a /etc/security/limits.conf echo "* hard nproc 64000" | sudo tee -a /etc/security/limits.conf
為您的部署配置足夠的文件句柄(fs.file-max)、內(nèi)核 pid 限制(kernel.pid_max)、每個(gè)進(jìn)程的最大線程數(shù)(kernel.threads-max)和每個(gè)進(jìn)程的最大內(nèi)存映射區(qū)域數(shù)(vm.max_map_count)。對(duì)于大型系統(tǒng),以下值是不錯(cuò)的參考值:
sysctl -w vm.max_map_count = 98000 sysctl -w kernel.pid_max = 64000 sysctl -w kernel.threads-max = 64000 sysctl -w vm.max_map_count=128000 sysctl -w net.core.somaxconn=65535
開(kāi)始調(diào)優(yōu)并使用吞吐量-性能配置文件
tuned-adm profile throughput-performance
04附錄
MongoDB conf file
processManagement: fork: true net: bindIp: %SERVER% port: %PORT% storage: dbPath: %DATA_ROOT%/%PORT% engine: wiredTiger wiredTiger: engineConfig: journalCompressor: snappy cacheSizeGB: 30 collectionConfig: blockCompressor: snappy systemLog: destination: file path: "%DATA_ROOT%/%PORT%/mongod.log" logAppend: true storage: journal: enabled: true
-
處理器
+關(guān)注
關(guān)注
68文章
19813瀏覽量
233614 -
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3901瀏覽量
65787 -
開(kāi)源
+關(guān)注
關(guān)注
3文章
3616瀏覽量
43494 -
nosql
+關(guān)注
關(guān)注
0文章
39瀏覽量
10258 -
Ampere
+關(guān)注
關(guān)注
1文章
81瀏覽量
4671
原文標(biāo)題:安博士講堂|針對(duì) Ampere? Altra? 處理器的 MongoDB 優(yōu)化指南
文章出處:【微信號(hào):AmpereComputing,微信公眾號(hào):安晟培半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Ampere推出業(yè)內(nèi)首款擁有最多內(nèi)核數(shù)量的云原生處理器系列
業(yè)界首款!Ampere發(fā)布有80個(gè)核心的ARM處理器
Ampere發(fā)布業(yè)內(nèi)首款80核ARM架構(gòu)64位處理器Altra 并已開(kāi)始向云服務(wù)和邊緣計(jì)算客戶出樣
Ampere全新推出業(yè)界首款80核服務(wù)器處理器Ampere Altra?處理器
安晟培半導(dǎo)體Ampere Altra處理器推出,應(yīng)用于云和邊緣計(jì)算數(shù)據(jù)中心中
128核云原生新力作:Ampere? Altra? Max性能參數(shù)公布,提升50%!
詳細(xì)解說(shuō)Ampere Altra性能測(cè)試與結(jié)果對(duì)比

Ampere? Altra? Max 對(duì)比測(cè)試數(shù)據(jù)公布,性能能效雙領(lǐng)先

Ampere Altra處理器實(shí)現(xiàn)Arm架構(gòu)運(yùn)行虛擬機(jī)
HPE正式發(fā)布搭載Ampere云原生處理器的HPE ProLiant RL300 Gen11平臺(tái)
Ampere全新AmpereOne系列處理器,多達(dá)192個(gè)單線程Ampere核
Ampere發(fā)布AmpereOne系列處理器,單顆處理器支持最高192個(gè)物理核心

Ampere Altra系列處理器的鎖和內(nèi)存序

評(píng)論