sách gpt4 ăn đã đi

Các hạn chế khác nhau về số lượng kết nối ổ cắm đồng thời cao tối đa trong Linux (giải thích chi tiết)

In lại Tác giả: qq735679552 Thời gian cập nhật: 27-09-2022 22:32:09 32 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết trên blog CFSDN này về các hạn chế khác nhau đối với số lượng kết nối ổ cắm đồng thời cao tối đa trong Linux (giải thích chi tiết) được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.

1. Sửa đổi giới hạn số lượng tệp mà quy trình người dùng có thể mở.

Trên nền tảng Linux, cho dù bạn viết chương trình máy khách hay chương trình máy chủ, khi xử lý các kết nối TCP đồng thời cao, số lượng đồng thời tối đa phải tuân theo giới hạn của hệ thống về số lượng tệp mà người dùng có thể mở cùng lúc trong một quy trình duy nhất (điều này là do hệ thống cung cấp Mỗi kết nối TCP tạo ra một tay cầm ổ cắm và mỗi tay cầm ổ cắm cũng là một tay cầm tệp). Bạn có thể sử dụng lệnh ulimit để xem giới hạn số lượng tệp mà hệ thống cho phép quy trình người dùng hiện tại mở:

[speng@as4 ~]$ ulimit -n 1024 。

Điều này có nghĩa là mỗi tiến trình của người dùng hiện tại được phép mở tối đa 1024 tệp cùng lúc. Trong số 1024 tệp này, đầu vào tiêu chuẩn, đầu ra tiêu chuẩn, lỗi tiêu chuẩn, ổ cắm nghe máy chủ và ổ cắm miền unix để liên lạc giữa các quá trình. phải được loại trừ. Đang chờ tệp thì số lượng tệp còn lại có thể được sử dụng cho kết nối socket máy khách chỉ khoảng 1024-10=1014. Điều đó có nghĩa là, theo mặc định, các chương trình giao tiếp dựa trên Linux cho phép tối đa 1014 kết nối TCP đồng thời cùng một lúc.

Đối với các trình xử lý giao tiếp muốn hỗ trợ số lượng kết nối TCP đồng thời cao hơn, giới hạn mềm và giới hạn cứng của Linux đối với số lượng tệp được mở đồng thời bởi quy trình của người dùng hiện tại phải được sửa đổi. Giới hạn mềm có nghĩa là Linux giới hạn hơn nữa số lượng tệp mà người dùng có thể mở cùng lúc trong phạm vi mà hệ thống hiện tại có thể chịu được; giới hạn cứng là số lượng tệp tối đa mà hệ thống có thể mở cùng lúc được tính toán; dựa trên tài nguyên phần cứng hệ thống (chủ yếu là bộ nhớ hệ thống). Thông thường giới hạn mềm nhỏ hơn hoặc bằng giới hạn cứng.

Cách dễ nhất để sửa đổi các giới hạn trên là sử dụng lệnh ulimit:

[speng@as4 ~]$ ulimit -n 。

Trong lệnh trên, chỉ định in để đặt số lượng tệp tối đa được phép mở bằng một quy trình. Nếu hệ thống lặp lại nội dung như "Thao tác không được phép", điều đó có nghĩa là việc sửa đổi giới hạn trên không thành công, đó là do giá trị được chỉ định vượt quá giới hạn mềm hoặc giới hạn cứng của hệ thống Linux đối với số lượng tệp được người dùng mở. Vì vậy, cần phải sửa đổi các giới hạn mềm và cứng của hệ thống Linux về số lượng file mở cho người dùng.

Bước đầu tiên là sửa đổi tệp /etc/security/limits.conf và thêm các dòng sau vào tệp:

speng soft nofile 10240 speng hard nofile 10240 。

Trong số đó, speng chỉ định giới hạn tệp mở của người dùng nào sẽ được sửa đổi. Dấu '*' có thể được sử dụng để sửa đổi giới hạn cho tất cả người dùng; phần mềm hoặc phần cứng chỉ định xem nên sửa đổi giới hạn mềm hay giới hạn cứng; giá trị giới hạn mà bạn muốn sửa đổi, tức là số lượng tệp mở tối đa (xin lưu ý rằng giá trị giới hạn mềm phải nhỏ hơn hoặc bằng giới hạn cứng). Lưu tập tin sau khi thực hiện thay đổi.

Bước thứ hai là sửa đổi tệp /etc/pam.d/login và thêm các dòng sau vào tệp:

phiên yêu cầu /lib/security/pam_limits.so 。

Điều này cho Linux biết rằng sau khi người dùng hoàn tất đăng nhập hệ thống, mô-đun pam_limits.so sẽ được gọi để đặt giới hạn tối đa của hệ thống về số lượng tài nguyên khác nhau mà người dùng có thể sử dụng (bao gồm cả giới hạn về số lượng tệp tối đa mà người dùng có thể mở) và mô-đun pam_limits.so Cấu hình sẽ được đọc từ tệp /etc/security/limits.conf để đặt các giá trị giới hạn này. Lưu tập tin này sau khi sửa đổi.

Bước thứ ba là kiểm tra giới hạn cấp hệ thống Linux về số lượng tệp đang mở tối đa và sử dụng lệnh sau:

[speng@as4 ~]$ cat /proc/sys/fs/file-max 12158 。

Điều này cho thấy hệ thống Linux này cho phép mở tối đa 12.158 tệp cùng lúc (tức là bao gồm tổng số tệp được mở bởi tất cả người dùng), đây là giới hạn cứng cấp hệ thống Linux. về số lượng tệp đang mở không được vượt quá giá trị này. Thông thường giới hạn cứng cấp hệ thống này là số lượng tệp tối đa được mở cùng lúc được tính toán dựa trên tài nguyên phần cứng hệ thống khi hệ thống Linux khởi động. Nếu không có nhu cầu đặc biệt thì không nên sửa đổi giới hạn này trừ khi bạn muốn giới hạn. số lượng tệp được mở ở cấp độ người dùng. Đặt giá trị vượt quá giới hạn này. Cách sửa đổi giới hạn cứng này là sửa đổi tập lệnh /etc/rc.local và thêm dòng sau vào tập lệnh:

tiếng vang 22158 > /proc/sys/fs/file-max 。

Điều này cho phép Linux buộc phải đặt giới hạn cứng cấp hệ thống đối với số lượng tệp đang mở thành 22158 sau khi khởi động. Lưu tập tin này sau khi sửa đổi.

Sau khi hoàn thành các bước trên, hãy khởi động lại hệ thống. Nói chung, bạn có thể đặt số lượng tệp tối đa mà hệ thống Linux cho phép một quá trình duy nhất của một người dùng được chỉ định mở cùng lúc thành một giá trị được chỉ định. Nếu sau khi khởi động lại, sử dụng lệnh ulimit -n để kiểm tra xem giới hạn số lượng file mà người dùng có thể mở có còn thấp hơn giá trị tối đa được đặt ở các bước trên hay không, điều này có thể là do lệnh ulimit -n đã được sử dụng trong tập lệnh đăng nhập của người dùng /etc/profile để giới hạn số lượng tệp mà người dùng có thể mở cùng lúc. Bởi vì khi bạn sửa đổi giới hạn của hệ thống về số lượng tệp tối đa mà người dùng có thể mở cùng lúc thông qua ulimit-n, giá trị mới sửa đổi chỉ có thể nhỏ hơn hoặc bằng giá trị do ulimit-n đặt ra lần trước. , không thể sử dụng lệnh này để tăng giá trị giới hạn. Do đó, nếu vấn đề trên tồn tại, bạn chỉ có thể mở tệp tập lệnh /etc/profile và kiểm tra xem ulimit-n có được sử dụng để giới hạn số lượng tệp tối đa mà người dùng có thể mở cùng lúc hay không. Nếu tìm thấy, hãy xóa dòng này. Hoặc thay đổi giá trị đã đặt thành giá trị phù hợp, sau đó lưu file và người dùng có thể đăng xuất và đăng nhập lại vào hệ thống.

Thông qua các bước trên, giới hạn hệ thống về số lượng tệp đang mở được dỡ bỏ đối với trình xử lý giao tiếp hỗ trợ xử lý kết nối TCP đồng thời cao.

2. Sửa đổi các hạn chế liên quan của nhân mạng trên các kết nối TCP (tham khảo bài viết tiếp theo "Tối ưu hóa các tham số hạt nhân" để so sánh).

Khi viết trình xử lý giao tiếp máy khách hỗ trợ các kết nối TCP đồng thời cao trên Linux, đôi khi bạn thấy rằng mặc dù giới hạn hệ thống về số lượng tệp mà người dùng có thể mở cùng lúc đã được dỡ bỏ, vẫn sẽ có vấn đề khi số lượng tệp kết nối TCP đồng thời tăng lên một số lượng nhất định. Không thể thiết lập thành công kết nối TCP mới. Có nhiều lý do cho việc này xảy ra.

Nguyên nhân đầu tiên có thể là nhân mạng Linux có những hạn chế về phạm vi số cổng cục bộ. Tại thời điểm này, việc phân tích sâu hơn về lý do tại sao không thể thiết lập kết nối TCP sẽ cho thấy rằng vấn đề nằm ở lỗi trả về của lệnh gọi connect(). Thông báo lỗi hệ thống là "Không thể gán địa chỉ được yêu cầu". Đồng thời, nếu sử dụng công cụ tcpdump để giám sát mạng vào lúc này, bạn sẽ thấy rằng không có lưu lượng mạng nào để máy khách gửi gói SYN trong quá trình kết nối TCP. Những tình huống này cho thấy vấn đề nằm ở những hạn chế trong nhân hệ thống Linux cục bộ. Trên thực tế, nguyên nhân cốt lõi của vấn đề là mô-đun triển khai giao thức TCP/IP của nhân Linux giới hạn phạm vi số cổng cục bộ tương ứng với tất cả các kết nối TCP của máy khách trong hệ thống (ví dụ: nhân giới hạn phạm vi cổng cục bộ số đến 1024 ~ 32768 giữa). Khi có quá nhiều kết nối máy khách TCP trong hệ thống tại một thời điểm nhất định, do mỗi kết nối máy khách TCP chiếm một số cổng cục bộ duy nhất (số cổng này nằm trong giới hạn phạm vi số cổng cục bộ của hệ thống), nếu một số kết nối máy khách TCP có đã chiếm hết số cổng cục bộ Tại thời điểm này, không thể phân bổ số cổng cục bộ cho kết nối máy khách TCP mới. Do đó, hệ thống sẽ trả về lệnh gọi connect() trong trường hợp này không thành công và đặt thông báo lỗi. thành "Không thể gán địa chỉ được yêu cầu". Đối với các logic điều khiển này, bạn có thể xem mã nguồn hạt nhân Linux. Lấy hạt nhân linux2.6 làm ví dụ, bạn có thể xem các chức năng sau trong tệp tcp_ipv4.c:

int tĩnh tcp_v4_hash_connect(struct sock *sk) 。

Vui lòng lưu ý kiểm soát quyền truy cập vào biến sysctl_local_port_range trong hàm trên. Việc khởi tạo biến sysctl_local_port_range được đặt trong hàm sau trong tệp tcp.c:

lệnh __init tcp_init(void)

Phạm vi số cổng cục bộ được đặt theo mặc định khi kernel được biên dịch có thể quá nhỏ, do đó giới hạn phạm vi cổng cục bộ này cần phải được sửa đổi.

Bước đầu tiên là sửa đổi tệp /etc/sysctl.conf và thêm các dòng sau vào tệp:

net.ipv4.ip_local_port_range = 1024 65000 。

Điều này cho biết giới hạn phạm vi cổng cục bộ của hệ thống được đặt trong khoảng từ 1024 đến 65000. Lưu ý rằng giá trị tối thiểu của phạm vi cổng cục bộ phải lớn hơn hoặc bằng 1024 và giá trị tối đa của phạm vi cổng phải nhỏ hơn hoặc bằng 65535. Lưu tập tin này sau khi sửa đổi.

Bước thứ hai là thực thi lệnh sysctl:

[speng@as4 ~]$ sysctl -p Nếu không có thông báo lỗi trong hệ thống, điều đó có nghĩa là phạm vi cổng cục bộ mới được đặt thành công. Nếu được đặt theo phạm vi cổng trên, về mặt lý thuyết, một quy trình có thể thiết lập tới 60.000 kết nối máy khách TCP cùng một lúc.

Lý do thứ hai khiến kết nối TCP không thể được thiết lập có thể là do tường lửa IP_TABLE của nhân mạng Linux có giới hạn về số lượng kết nối TCP được theo dõi tối đa. Lúc này, chương trình sẽ xuất hiện bị chặn trong lệnh gọi connect(), như thể nó đã bị hỏng. Nếu bạn sử dụng công cụ tcpdump để giám sát mạng, bạn cũng sẽ thấy rằng không có lưu lượng mạng nào để máy khách gửi. gói SYN trong quá trình kết nối TCP. Vì tường lửa IP_TABLE sẽ theo dõi trạng thái của từng kết nối TCP trong kernel nên thông tin theo dõi sẽ được đặt trong cơ sở dữ liệu conntrack nằm trong bộ nhớ kernel. Khi có quá nhiều kết nối TCP trong hệ thống. , dung lượng cơ sở dữ liệu sẽ giảm. Không đủ, IP_TABLE không thể thiết lập thông tin theo dõi cho các kết nối TCP mới nên dường như nó bị chặn trong lệnh gọi connect(). Tại thời điểm này, bạn phải sửa đổi giới hạn của kernel đối với số lượng kết nối TCP được theo dõi tối đa. Phương pháp này tương tự như sửa đổi giới hạn của kernel trên phạm vi số cổng cục bộ:

Bước đầu tiên là sửa đổi tệp /etc/sysctl.conf và thêm các dòng sau vào tệp:

net.ipv4.ip_conntrack_max = 10240 。

Điều này cho biết việc đặt giới hạn của hệ thống đối với số lượng kết nối TCP tối đa được theo dõi là 10240. Xin lưu ý rằng giá trị giới hạn này phải càng nhỏ càng tốt để tiết kiệm mức sử dụng bộ nhớ kernel.

Bước thứ hai là thực thi lệnh sysctl: [speng@as4 ~]$ sysctl -p.

Nếu không có thông báo lỗi trong hệ thống, điều đó có nghĩa là hệ thống đã sửa đổi thành công số lượng kết nối TCP được theo dõi tối đa mới. Nếu các tham số trên được đặt, về mặt lý thuyết, một quy trình có thể thiết lập tối đa 10.000 kết nối máy khách TCP cùng một lúc.

3. Sử dụng công nghệ lập trình hỗ trợ I/O mạng có tốc độ đồng thời cao.

Khi viết các ứng dụng kết nối TCP đồng thời cao trên Linux, bạn phải sử dụng công nghệ I/O mạng và cơ chế gửi sự kiện I/O thích hợp.

Các công nghệ I/O có sẵn là I/O đồng bộ, I/O đồng bộ không chặn (còn gọi là I/O phản ứng) và I/O không đồng bộ. Trong trường hợp tính đồng thời TCP cao, nếu sử dụng I/O đồng bộ, điều này sẽ chặn nghiêm trọng hoạt động của chương trình trừ khi một luồng được tạo cho mỗi I/O kết nối TCP. Tuy nhiên, quá nhiều luồng sẽ gây ra chi phí lớn do việc lập lịch trình luồng của hệ thống. Do đó, không nên sử dụng I/O đồng bộ trong các tình huống có tính đồng thời TCP cao. Trong trường hợp này, bạn có thể cân nhắc sử dụng I/O đồng bộ không chặn hoặc I/O không đồng bộ. Các công nghệ I/O đồng bộ không chặn bao gồm việc sử dụng select(), poll(), epoll và các cơ chế khác. Công nghệ I/O không đồng bộ là sử dụng AIO.

Từ quan điểm của cơ chế gửi sự kiện I/O, việc sử dụng select() là không phù hợp vì nó hỗ trợ một số kết nối đồng thời có giới hạn (thường trong vòng 1024). Nếu xét đến hiệu suất thì poll() cũng không phù hợp. Mặc dù nó có thể hỗ trợ số lượng đồng thời TCP cao hơn, nhưng do cơ chế "bỏ phiếu" của nó nên khi số lượng đồng thời cao thì hiệu quả hoạt động của nó khá thấp và có thể có Các sự kiện I/O được phân bổ không đồng đều, khiến I/O bị "chết đói" trên một số kết nối TCP. Nếu bạn sử dụng epoll hoặc AIO thì không có vấn đề nêu trên (việc triển khai sớm công nghệ AIO trong nhân Linux đã đạt được bằng cách tạo một luồng trong nhân cho mỗi yêu cầu I/O. Cơ chế triển khai này rất hiệu quả trong trường hợp tốc độ cao kết nối TCP đồng thời. Thực sự có những vấn đề nghiêm trọng về hiệu suất khi sử dụng nó, nhưng trong nhân Linux mới nhất, việc triển khai AIO đã được cải thiện).

Tóm lại, khi phát triển các ứng dụng Linux hỗ trợ kết nối TCP đồng thời cao, bạn nên thử sử dụng công nghệ epoll hoặc AIO để triển khai điều khiển I/O trên các kết nối TCP đồng thời. Điều này sẽ cải thiện khả năng hỗ trợ của chương trình cho các kết nối TCP đồng thời cao. /O đảm bảo.

Tối ưu hóa các tham số kernel sysctl.conf.

/etc/sysctl.conf là tệp cấu hình được sử dụng để kiểm soát mạng Linux. Nó rất quan trọng đối với các chương trình dựa vào mạng (chẳng hạn như máy chủ web và máy chủ bộ nhớ đệm theo mặc định).

Cấu hình được đề xuất (xóa nội dung gốc /etc/sysctl.conf và sao chép nội dung sau vào đó):

net.ipv4.ip_local_port_range = 1024 65536 net.core.rmem_max=16777216 net.core.wmem_max=16777216 net.ipv4.tcp_rmem=4096 87380 16777216 net.ipv4.tcp_wmem=4096 65536 16777216 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_window_scaling = 0 net.ipv4.tcp_sack = 0 net.core.netdev_max_backlog = 30000 net.ipv4.tcp_no_metrics_save=1 net.core.somaxconn = 262144 net.ipv4.tcp_syncookies = 0 net.ipv4.tcp_max_orphans = 262144 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 。

Cấu hình này đề cập đến cấu hình được đề xuất của véc ni máy chủ bộ đệm và cấu hình được đề xuất để tối ưu hóa hệ thống máy chủ SunOne.

Địa chỉ của cấu hình được đề xuất để điều chỉnh vecni là: http://varnish.projects.linpro.no/wiki/Performance.

Tuy nhiên, cấu hình được Varnish đề xuất có vấn đề. Hoạt động thực tế cho thấy cấu hình "net.ipv4.tcp_fin_timeout = 3" thường sẽ khiến trang không mở được và khi cư dân mạng đang sử dụng trình duyệt IE6, sau khi truy cập trang web; Trong một khoảng thời gian, tất cả các trang web đều không thể mở được nhưng nó vẫn hoạt động bình thường sau khi khởi động lại trình duyệt. Có thể tốc độ Internet ở nước ngoài nhanh. Điều kiện quốc gia của chúng tôi xác định rằng chúng tôi cần điều chỉnh "net.ipv4.tcp_fin_timeout = 10". Trong trường hợp 10 giây, mọi thứ đều bình thường (kết luận hoạt động thực tế).

Sau khi sửa đổi, thực hiện:

/sbin/sysctl -p /etc/sysctl.conf /sbin/sysctl -w net.ipv4.route.flush=1 。

Lệnh có hiệu lực. Để đảm bảo an toàn, bạn cũng có thể khởi động lại hệ thống.

Điều chỉnh số lượng tập tin:

Sau khi hệ thống Linux đã tối ưu hóa mạng, cần phải tăng số lượng tệp được hệ thống cho phép mở để hỗ trợ đồng thời lớn. Mặc định 1024 là chưa đủ.

Thực hiện lệnh:

Shell sử dụng lệnh echo ulimit -HSn 65536 >> /etc/rc.local echo ulimit -HSn 65536 >>/root/.bash_profile ulimit -HSn 65536 。

Bài viết trên về các hạn chế khác nhau (giải thích chi tiết) về số lượng kết nối ổ cắm đồng thời cao tối đa trong Linux là toàn bộ nội dung được biên tập viên chia sẻ, hy vọng có thể cho các bạn tham khảo và mong các bạn ủng hộ.

Cuối cùng, bài viết này về các hạn chế khác nhau (giải thích chi tiết) về số lượng kết nối ổ cắm đồng thời cao tối đa trong Linux sẽ kết thúc tại đây. Giải thích chi tiết) vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

32 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress