针对Debian系统上的MongoDB优化,可以从操作系统配置、MongoDB配置文件(mongod.conf)、索引设计以及硬件资源四个维度入手。
以下是详细的优化指南:
MongoDB 对 Linux 系统的某些参数比较敏感,尤其是内存和磁盘方面。
MongoDB 官方强烈建议禁用 THP,因为它会导致内存碎片和性能下降。
sudo nano /etc/systemd/system/disable-thp.service
[Unit]
Description=Disable Transparent Huge Pages (THP)
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null'
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable disable-thp.service
sudo systemctl start disable-thp.service
MongoDB 需要打开大量的文件。Debian 默认的限制可能太低。
/etc/security/limits.conf:sudo nano /etc/security/limits.conf
mongodb):mongodb soft nofile 64000
mongodb hard nofile 64000
mongodb soft nproc 64000
mongodb hard nproc 64000
注意:如果使用 systemd 启动,还需要检查 systemd 的 service 文件限制。对于 SSD 硬盘,建议使用 noop 或 deadline 调度器;对于机械硬盘,建议使用 deadline。
cat /sys/block/sda/queue/scheduler (替换 sda 为你的磁盘)echo deadline | sudo tee /sys/block/sda/queue/scheduler/etc/default/grub,在 GRUB_CMDLINE_LINUX 中添加 elevator=deadline,然后 sudo update-grub。建议使用 XFS 文件系统,它对 MongoDB 的大文件(如 journaling 和数据文件)处理性能更好。Ext4 也可以,但 XFS 是官方推荐。
配置文件通常位于 /etc/mongod.conf。
net:
port: 27017
bindIp: 0.0.0.0 # 生产环境建议只绑定内网IP,不要直接暴露公网
maxIncomingConnections: 1000 # 根据应用需求调整,默认是65536,但需配合 ulimit
WiredTiger 是默认引擎,重点是调整缓存大小。
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true # 生产环境务必开启,防止断电数据丢失
wiredTiger:
engineConfig:
# 设置为物理内存的50%-70%,但至少保留1GB给操作系统和其他进程
# 例如:服务器有 4G 内存,可以设置为 2G 或 3G
cacheSizeGB: 2
journalCompressor: snappy
collectionConfig:
blockCompressor: snappy # 默认 snappy,速度快;zlib 压缩率高但慢;zstd 平衡
开启慢查询日志以便后续优化。
operationProfiling:
mode: slowOp # 或者 "all" 用于调试,生产环境用 slowOp
slowOpThresholdMs: 100 # 超过100毫秒的操作记录
这是提升性能最立竿见影的方法。
find(), sort() 中的字段)建立索引。db.collection.createIndex({ userId: 1, createdAt: -1 })
explain("executionStats") 分析查询是否使用了索引 (IXSCAN) 还是全表扫描 (COLLSCAN)。查询时只返回需要的字段,减少网络传输和内存消耗。
// 不好:返回所有字段
db.users.find({ name: "John" })
// 好:只返回 email 和 age
db.users.find({ name: "John" }, { email: 1, age: 1, _id: 0 })
尽量使用批量插入 (insertMany) 和批量更新,减少网络往返次数。
db.collection.deleteMany() 后,建议运行 compact 或重建集合来回收磁盘空间(WiredTiger 通常能自动处理碎片,但极端情况除外)。mongostat --host 127.0.0.1 -u adminUser -p password --authenticationDatabase admin
htop (CPU/内存), iotop (磁盘IO), iftop (网络)。ulimit 是否设置足够高?mongod.conf 中 cacheSizeGB 是否根据内存调整?通过以上步骤,你的 Debian 上的 MongoDB 应该能获得显著的性能提升。