日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2024/7/23 linux 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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服务器上创建大量连接和线程的记忆的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。