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
總結
以上是生活随笔為你收集整理的linux mongo 服务器,如何用MongoDB在Linux服务器上创建大量连接和线程的记忆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 360产品演示代码 css3 html5
- 下一篇: linux 其他常用命令