MongoDB 生產環境筆記

MongoDB 生產環境筆記

在生產環境中,咱們配置MongoDB須要注意點有不少,而不是一安裝就可使用。咱們須要配置一些內核和系統參數。由於這些參數是會影響到咱們 MongoDB 的性能的。
若是你的MongoDB 實例所在的服務器還有其它業務和應用,那麼修改下面的參數須要注意是否會影響其它應用的性能和運行狀態。linux

官方文檔連接:https://docs.mongodb.com/manual/administration/production-notes/mongodb

須要配置的點有:shell

1、vm.zone_reclaim_mode 參數

設置內核參數 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

2、添加 swap 分區

若是內存空間不是那麼充足的話,咱們能夠爲系統配置 swap 分區。具體配置見文章 linux系統添加swap(虛擬內存)分區bash

對於 WiredTiger 儲存引擎,在壓力比較大的狀況下,WiredTiger 會將數據放置在 swap 分區裏。服務器

3、設置 swappiness 參數

在 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

4、內核和文件系統版本

在 Linux 系統上運行 MongoDB ,咱們建議使用 Linux內核版本2.6.36或者更高版本,使用 XFS 或者是 EXT4 文件系統,強烈建議使用 XFS 文件系統。由於 EXT4 和 WiredTiger 一塊兒使用會有可能出現性能問題。tcp

MongoDB 須要使用 glibc 庫,最好版本至少是 2.13 上。

5、禁用 Transparent Huge Pages (THP)

在啓動的時候咱們能夠看到相似的日誌:

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的介紹見 :文章

查看 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

腳本禁用 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

tunedktune是Red Hat和CentOS上可用的動態內核調優工具,能夠禁用 THP 。

要在 tunedktune 中禁用 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]

6、ulimit 設置

一般系統默認給用戶的最大進程數和最大能夠打開的文件數是比較低的,因此在啓動 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

7、tcp_keepalive_time

該參數用於 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

8、同步時間

若是咱們部署的是副本集羣,咱們須要配置腳本,讓這幾臺節點的的時間同步。

相關文章
相關標籤/搜索