概述
MongoDB 是一個流行的面向文檔的,跨平臺開源 NoSQL 數據庫。其靈活的數據模型能支持存儲具有完整索引支持和復制的非結構化數據。根據 DB-Engines 的數據,截至 2023 年 1 月,MongoDB 是第五大最受歡迎的數據庫。它是用 c++ 編寫的,旨在為 web 應用程序提供可擴展的高性能數據存儲解決方案。
本指南的目的是描述在 AmpereAltra處理器上以最佳方式運行 MongoDB 的一些技術參考。
01構建先決條件
以高性能方式運行應用程序首先要正確構建應用程序并使用適當的編譯器標志。當在 AmpereAltra處理器上從源碼開始構建并運行應用程序時,我們建議使用 GCC 編譯器版本 10 或更高的版本。較新版本的編譯器往往對新的處理器特性有更好的支持,并結合了更高級的代碼生成技術。
我們的測試使用 CentOS Stream 8 作為操作系統。
從 SCL 存儲庫下載并安裝了 GCC 11:
yum -y install scl-utils scl-utils-build yum -y install gcc-toolset-11.aarch64 scl enable gcc-toolset-11 bash
對于 Ubuntu 22.04 LTS 和 Debian 等其他操作系統,GCC 11 也是可用的,可以直接從各自的存儲庫安裝。
02構建和安裝
MongoDB 可以從操作系統包管理器提供的存儲庫中安裝,也可以直接從源代碼構建。全面的 MongoDB 安裝指南可以在官方文檔中找到。我們建議從源代碼安裝,以獲得更好的靈活性,以及控制和配置特定模塊的能力。
為了構建針對 AmpereAltra處理器家族優化的 MongoDB,可以在編譯階段添加可以利用硬件特性的額外編譯選項。用于編譯的 MongoDB 源代碼可以從 MongoDB 下載頁面獲得。本指南使用穩定版本 MongoDB 6.0.3。從源代碼安裝需要某些庫和附加模塊,它們將被編譯成二進制文件。
MongoDB 安裝指南:https://github.com/mongodb/mongo/blob/master/docs/building.md
MongoDB 下載頁面:
https://github.com/mongodb/mongo
執行以下步驟來安裝依賴項。
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 連接,請從各自的 git 存儲庫下載這些附加源代碼的最新代碼。
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+,并且必須安裝幾個 Python 模塊,運行命令:
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 支持許多編譯選項,如 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 存儲引擎和 snappy 作為塊和日志壓縮器。請參考附錄中顯示的 mongodb.conf 文件配置服務器。
#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性能優化
有數百種設置可以改變 MongoDB 的功能和性能。下面列出的只是一些可以使用的更常見的調節變量。推薦參考 MongoDB 文檔了解所有設置詳情。
cachesizeGB
定義了內部使用的緩存最大值,WiredTiger 將其適用于所有數據。
增加 cacheSizeGB 可以減少磁盤 io 的影響,提高讀寫性能。
使用“db.serverStatus(). wiredtiger”命令檢查“maximum bytes configured”(cacheSizeGB或默認設置配置的最大緩存大小)和“bytes current in the cache”(當前緩存中的數據大小)。
Eviction 優化
當應用程序接近最大緩存大小時,WiredTiger 開始清除,以防止內存使用增長過大,遵循“最近最少使用”算法。" eviction=(threads_min=X) "是正在運行的 WiredTiger Eviction 工作線程的最小數量,取值必須在 1 到 20 之間。
" eviction=(threads_max=X) "是正在運行的WiredTiger Eviction工作線程的最大數量。取值必須在 1 到 20 之間。這應該與 MongoDB 的 threads_min 設置相匹配。
#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 來控制存儲引擎同時處理的讀/寫操作的數量。默認值是 128,在大多數情況下都很有效的。如果 ticket 降為 0,則后續所有操作都排隊等待新的 ticket。長時間運行的操作可能會導致可用 ticket 的數量減少,從而降低系統的并發性。例如,增加 ticket 的配置值可以增加并發性。
#讀取當前值 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 日志數據的壓縮類型。壓縮操作會消耗額外的 CPU 資源,但也最小化了存儲消耗。
blockCompressor
指定集合數據的默認壓縮。在創建集合時,可以在每個集合的基礎上重置此設置。當然壓縮操作會消耗額外的 CPU 資源,但也最小化了存儲消耗。
64K PAGESIZE
內核 PAGESIZE 建議設置為 64K。可以使用命令“getconf PAGESIZE”來確定。PAGESIZE 是一個內存頁的大小,以字節為單位,在編譯內核時配置。使用較大的頁面可以減少將虛擬頁面地址轉換為物理頁面地址的硬件延遲。延遲的減少是由于硬件翻譯緩存(如 translation lookaside buffer,TLB)的效率得到了提高。因為硬件轉換緩存只有有限數量的條目,所以使用更大的頁面大小會增加緩存中每個條目可以轉換的虛擬內存量。這不但增加了應用程序可以訪問的內存量,而且不會導致硬件轉換延遲。
Transparent Huge Pages
透明大頁(Transparent Huge Pages, THP)是一種 Linux 內存管理系統,它通過使用更大的內存頁,減少了在具有大量內存的機器上 TLB(Translation Lookaside Buffer)查找的開銷。然而,在啟用 THP 的情況下,數據庫工作負載通常表現不佳,因為它們往往具有稀疏而非連續的內存訪問模式。在 Linux 上運行 MongoDB 時,應該禁用 THP 以獲得最佳性能。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
大多數類 unix 操作系統,包括 Linux 和 macOS,都提供了在每個進程和每個用戶的基礎上限制和控制系統資源(如線程、文件和網絡連接)使用的方法。這些“限制”可以防止單個用戶使用過多的系統資源。有時,這些限制的默認值比較低,這可能會在正常的 MongoDB 操作過程中導致許多問題。
要為這些版本配置 ulimit 值,請創建一個名為?/etc/security/limits.d/99-mongodb-nproc.conf? 的文件,并添加新值以提高該進程的限制閾值。
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)、內核 pid 限制(kernel.pid_max)、每個進程的最大線程數(kernel.threads-max)和每個進程的最大內存映射區域數(vm.max_map_count)。對于大型系統,以下值是不錯的參考值:
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
開始調優并使用吞吐量-性能配置文件
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
-
處理器
+關注
關注
68文章
19259瀏覽量
229653 -
數據庫
+關注
關注
7文章
3794瀏覽量
64362 -
開源
+關注
關注
3文章
3309瀏覽量
42471 -
nosql
+關注
關注
0文章
39瀏覽量
9997 -
Ampere
+關注
關注
1文章
66瀏覽量
4541
原文標題:安博士講堂|針對 Ampere? Altra? 處理器的 MongoDB 優化指南
文章出處:【微信號:AmpereComputing,微信公眾號:安晟培半導體】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論