linux mongo 服务器,如何用MongoDB在Linux服务器上创建大量连接和线程的记忆

最近,我们想对MongoDB在大量连接中的行为进行基准测试。这使我不得不重新讨论该主题,并刷新关于如何在Linux服务器上创建大量连接和线程的记忆。在此过程中,我发现了一些没有使用过的新可调参数。

MongoDB配置

甚至MongoDB本身也可以选择限制传入连接的最大数量。默认为64k。

# mongod.conf

net:

maxIncomingConnections: 999999

请注意,默认情况下,MongoDB为每个传入的连接创建一个专用的工作线程。我想测试此默认值,但我应该指出,有一个相关设置更改为工作池模型。据推测,这将允许大量的传入连接并使用更少的线程。请注意,即使正式记录了此选项,它仍被标记为实验性的:

net:

serviceExecutor: adaptive

但是对于我的测试,我将为每个连接创建一个线程,因此还需要以下所有配置…

Linux配置

为了正确设置ulimit,我需要回过头来,记住我在大学中学到的所有基本Unix原理:

一切都是文件。特别是,就ulimit而言,TCP / IP连接是打开的文件。

由于历史原因,nproc实际上是线程数。从历史上看,Linux进程是单线程,并发工作负载是多进程。

线程从堆栈分配内存,堆栈也具有最大大小。

# Connections are files because in Unix everything is a file.

echo "ec2-user soft nofile 9999999" | sudo tee -a /etc/security/limits.conf

echo "ec2-user hard nofile 9999999" | sudo tee -a /etc/security/limits.conf

# nproc is really number of threads.

echo "ec2-user soft nproc 9999999" | sudo tee -a /etc/security/limits.conf

echo "ec2-user hard nproc 9999999" | sudo tee -a /etc/security/limits.conf

# Threads need memory from the stack.

echo "ec2-user soft stack 9999999" | sudo tee -a /etc/security/limits.conf

echo "ec2-user hard stack 9999999" | sudo tee -a /etc/security/limits.conf

但是,创建线程使用mmap从堆栈分配内存。并且在内核级别上,有一个设置,用于设置每个进程的最大映射内存块的最大数量,该设置也必须增加:

echo 9999999 > /proc/sys/vm/max_map_count

# If you want to persist across reboots

echo "vm.max_map_count=9999999" | sudo tee -a /etc/sysctl.conf

最终,在基准客户端上,我开始遇到TCP / IP的限制。在TCP协议中,一个套接字用元组(本地地址,本地端口,远程地址,远程端口)标识,并且该元组在每个套接字中必须是唯一的。端口号的范围是1到65535。因此,从一个基准客户端中,我只能创建65535个传出连接。为了对更多的连接进行基准测试,唯一的选择是拥有一个以上的客户端主机,或至少一个客户端的IP地址。但是我没有走那么远。

(在服务器端,端口当然是众所周知的mongod端口27017。)

令我惊讶的是,默认情况下Linux甚至都不会使用TCP可能的全部65k端口。甚至必须对此进行配置:

echo 1024 65530 > /proc/sys/net/ipv4/ip_local_port_range

# If you want to persist across reboots

echo "net.ipv4.ip_local_port_range = 1024 65530" | sudo tee -a /etc/sysctl.conf

这两个数字是最小和最大传出端口。请注意,在服务器(基准客户端)上不需要此配置。

EC2配置

在AWS上,我发现在尝试使用的M5系列EC2实例(最大为m5.2xlarge)上,我只能创建32k连接和线程。使用完全相同的配置,但是切换到c3.8xlarge实例类型,我能够创建更多实例,达到上述ip_local_port_range所规定的接近65k的限制。

我尚未找到任何可以证实我对M5实例的观察的AWS文档。AWS支持人员也没有确认这一点。所以这对我来说仍然可能是一个错误。

摘要

因此,这里是一个副本和可粘贴脚本中的所有步骤。这是为运行Amazon Linux 2的AWS实例专门构建的。您可能需要针对其他版本的Linux进行调整。特别是在Centos和RHEL上,将用户名从更改ec2-user为root。

# This assumes a fresh Linux host from standard Amazon Linux 2 images.

# Adaptable to Centos/RHEL too.

sudo su

sed -i .orig 's/net\:/net\:\n maxIncomingConnections: 999999/' /etc/mongod.conf

# Connections are files because in Unix everything is a file.

echo "ec2-user soft nofile 9999999" | sudo tee -a /etc/security/limits.conf

echo "ec2-user hard nofile 9999999" | sudo tee -a /etc/security/limits.conf

# nproc is really number of threads.

echo "ec2-user soft nproc 9999999" | sudo tee -a /etc/security/limits.conf

echo "ec2-user hard nproc 9999999" | sudo tee -a /etc/security/limits.conf

# Threads need memory from the stack.

echo "ec2-user soft stack 9999999" | sudo tee -a /etc/security/limits.conf

echo "ec2-user hard stack 9999999" | sudo tee -a /etc/security/limits.conf

# Threads allocate memory with mmap

echo 9999999 > /proc/sys/vm/max_map_count

# If you want to persist across reboots

echo "vm.max_map_count=9999999" | sudo tee -a /etc/sysctl.conf

# Needed for outgoing connections (on client)

echo 1024 65530 > /proc/sys/net/ipv4/ip_local_port_range

echo "net.ipv4.ip_local_port_range = 1024 65530" | sudo tee -a /etc/sysctl.conf

# Checks EC2 instance type but doesn't do anything about it

curl http://169.254.169.254/latest/meta-data/instance-type

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值