目錄html
在生產環境中,咱們配置MongoDB
須要注意點有不少,而不是一安裝就可使用。咱們須要配置一些內核和系統參數。由於這些參數是會影響到咱們 MongoDB
的性能的。
若是你的MongoDB
實例所在的服務器還有其它業務和應用,那麼修改下面的參數須要注意是否會影響其它應用的性能和運行狀態。linux
官方文檔連接:https://docs.mongodb.com/manual/administration/production-notes/mongodb
須要配置的點有:shell
設置內核參數 vm.zone_reclaim_mode
,該參數是設置當一個內存區域的內存耗盡的時候,是從內部回收,仍是去下一個內存區域尋找,0爲去下一個區域尋找,非0表示當前區域回收。數據庫
# 修改,重啓後失效 sysctl -w vm.zone_reclaim_mode=0 # 永久修改 echo "vm.zone_reclaim_mode = 0" >> /etc/sysctl.conf sysctl -p # 查詢當前參數配置 sysctl -a |grep vm.zone_reclaim_mode
若是內存空間不是那麼充足的話,咱們能夠爲系統配置 swap 分區。具體配置見文章 linux系統添加swap(虛擬內存)分區。bash
對於 WiredTiger 儲存引擎,在壓力比較大的狀況下,WiredTiger 會將數據放置在 swap 分區裏。服務器
在 Linux 系統中,能夠經過查看 /proc/sys/vm/swappiness 內容的值來肯定系統對 SWAP 分區的使用原則。當swappiness 內容的值爲 0 時,表示最大限度地使用物理內存,物理內存使用完畢後,纔會使用 SWAP 分區。當swappiness 內容的值爲 100 時,表示積極地使用 SWAP 分區,而且把內存中的數據及時地置換到 SWAP 分區。
默認值爲 0,表示須要在物理內存使用完畢後纔會使用 SWAP 分區,架構
若是咱們運行的主機系統 RHEL / CentOS 的內核版本在 2.6.32-303 及以上,咱們能夠把該值設置爲 1。app
# 臨時修改 sysctl -w vm.swappiness=1 # 永久修改 cat "vm.swappiness = 1" >> /etc/sysctl.conf sysctl -p # 查看配置參數 sysctl -a |grep vm.swappiness
在 Linux 系統上運行 MongoDB ,咱們建議使用 Linux內核版本2.6.36或者更高版本,使用 XFS 或者是 EXT4 文件系統,強烈建議使用 XFS 文件系統。由於 EXT4 和 WiredTiger 一塊兒使用會有可能出現性能問題。tcp
MongoDB 須要使用 glibc 庫,最好版本至少是 2.13 上。
在啓動的時候咱們能夠看到相似的日誌:
2019-04-12T10:11:26.665+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2019-04-12T10:11:26.665+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2019-04-12T10:11:26.665+0800 I CONTROL [initandlisten] 2019-04-12T10:11:26.665+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2019-04-12T10:11:26.665+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
上面的警告就是意味着咱們須要設置 /sys/kernel/mm/transparent_hugepage/defrag
和/sys/kernel/mm/transparent_hugepage/enabled
兩個參數設置爲 never ,上面參數的設置就是表明着 Transparent Huge Pages(THP)
, 在瞭解 THP 前,咱們須要先了解下 Huge Pages(標準頁),Huge Pages是從Linux Kernel 2.6後被引入的。目的是使用更大的內存頁面(memory page size) 以適應愈來愈大的系統內存,讓操做系統能夠支持現代硬件架構的大頁面容量功能。而THP(Transparent Huge Pages) 是從RHEL6 開始引入的一個功能,THP 是一個抽象層, 能夠自動建立、管理和使用傳統大頁的大多數方面。
Huge pages can be difficult to manage manually, and often require significant changes to code in order to be used effectively. As such, Red Hat Enterprise Linux 6 also implemented the use of transparent huge pages(THP). THP is an abstraction layer that automates most aspects of creating, managing, and using huge pages.
THP hides much of the complexity in using huge pages from system administrators and developers. As the goal of THP is improving performance, its developers (both from the community and Red Hat) have tested and optimized THP across a wide range of systems, configurations, applications, and workloads. This allows the default settings of THP to improve the performance of most system configurations. However, THP is not recommended for database workloads.
在官方文檔中最後一行寫到: THP is not recommended for database workloads.
也就是 THP 不適用於在數據庫上。由於數據庫是不連續的內存訪問模式,咱們須要禁用THP以確保使用MongoDB得到最佳性能。
詳細的有關 Huge Pages 和Transparent Huge Pages的介紹見 :文章
cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never cat /sys/kernel/mm/transparent_hugepage/defrag [always] madvise never #若是輸出結果爲[always]表示 THP 啓用了。[never]表示 THP 禁用、[madvise]表示(只在MADV_HUGEPAGE標誌的VMA中使用THP
建立 init.d 腳本 /etc/init.d/disable-transparent-hugepages
#!/bin/bash ### BEGIN INIT INFO # Provides: disable-transparent-hugepages # Required-Start: $local_fs # Required-Stop: # X-Start-Before: mongod mongodb-mms-automation-agent # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Disable Linux transparent huge pages # Description: Disable Linux transparent huge pages, to improve # database performance. ### END INIT INFO case $1 in start) if [ -d /sys/kernel/mm/transparent_hugepage ]; then thp_path=/sys/kernel/mm/transparent_hugepage elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then thp_path=/sys/kernel/mm/redhat_transparent_hugepage else return 0 fi echo 'never' > ${thp_path}/enabled echo 'never' > ${thp_path}/defrag re='^[0-1]+$' if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]] then # RHEL 7 echo 0 > ${thp_path}/khugepaged/defrag else # RHEL 6 echo 'no' > ${thp_path}/khugepaged/defrag fi unset re unset thp_path ;; esac
chmod 755 /etc/init.d/disable-transparent-hugepages # 設置具備可執行權限 chkconfig --add disable-transparent-hugepages # 設置開機自啓
上面的配置須要重啓主機才能生效。
生效配置
/etc/init.d/disable-transparent-hugepages start
tuned
和ktune
是Red Hat和CentOS上可用的動態內核調優工具,能夠禁用 THP 。
要在 tuned
和ktune
中禁用 THP, 須要咱們將配置文件的THP值設置爲 never,不然 tuned 或者 ktune 會更改咱們設置的值。
When RHEL 7 / CentOS 7 run in a virtual environment, the
tuned
tool automatically invokes a performance profile derived from performance throughput, which automatically sets the readahead settings to 4MB. This can negatively impact performance.
CentOS 6
cp -r /etc/tune-profiles/default /etc/tune-profiles/no-thp echo "set_transparent_hugepages never" >>/etc/tune-profiles/no-thp/ktune.sh tuned-adm profile no-thp
CentOS 7
mkdir /etc/tuned/no-thp cat << EOF >>/etc/tuned/no-thp/tuned.conf [main] include=virtual-guest [vm] transparent_hugepages=never EOF tuned-adm profile no-thp
測試修改是否生效
cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag 生效配置: always madvise [never]
一般系統默認給用戶的最大進程數和最大能夠打開的文件數是比較低的,因此在啓動 MongoDB
的時候咱們會看到如下警告。
WARNING: soft rlimits too low. rlimits set to 4096 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.
官網的推薦配置是:
# 推薦配置 -f (file size): unlimited -t (cpu time): unlimited -v (virtual memory): unlimited [1] -l (locked-in-memory size): unlimited -n (open files): 64000 -m (memory size): unlimited [1] [2] -u (processes/threads): 64000
咱們能夠直接更改用戶的默認配置,也能夠經過配置 systemd
服務,並參數寫入 Service
。
cat <<EOF >>/usr/lib/systemd/system/mongodb.service [Unit] Description= mongodb service manager [Service] # Other directives omitted # (file size) LimitFSIZE=infinity # (cpu time) LimitCPU=infinity # (virtual memory size) LimitAS=infinity # (locked-in-memory size) LimitMEMLOCK=infinity # (open files) LimitNOFILE=64000 # (processes/threads) LimitNPROC=64000 Type=forking User=mongodb Group=mongodb PIDFile=/opt/mongodb/logs/mongod.pid ExecStart= /opt/mongodb/bin/mongod -f /opt/mongodb/mongodb.conf ExecStop= /opt/mongodb/bin/mongod --shutdown --dbpath /opt/mongodb/data Restart=always [Install] WantedBy=multi-user.target EOF
該參數用於 TCP 發送 keepalive 探測消息的間隔時間(秒),用於確認 TCP 鏈接是否有效。
查看系統的默認值:
# 經過sysctl 查看 sysctl net.ipv4.tcp_keepalive_time # 經過查看文件的值 cat /proc/sys/net/ipv4/tcp_keepalive_time # 通常系統的默認值是 7200
Mongodb 官網建議將該值設置爲 300 。
臨時更改
systemctl -w net.ipv4.tcp_keepalive_time=300
永久更改,
echo "net.ipv4.tcp_keepalive_time = 300" >> /etc/sysctl.conf sysctl -p
若是咱們部署的是副本集羣,咱們須要配置腳本,讓這幾臺節點的的時間同步。