2009-03-16 47 views
61

Có ai biết có bao nhiêu kết nối tcp-socket có thể thực hiện trên máy chủ gốc chuẩn hiện đại không? (Thường có ít lưu lượng truy cập hơn trên mỗi kết nối, nhưng tất cả các kết nối phải luôn luôn hoạt động.)Có thể có bao nhiêu kết nối ổ cắm?

EDIT: Chúng tôi sẽ sử dụng Máy chủ Linux.

+1

Đối với Windows, hãy xem câu hỏi này [Số lượng tối đa các kết nối tcp/ip đồng thời của Windows là gì?] [1] [1]: http: //stackoverflow.com/questions/413110/which-is-the-maximum -number-of-windows-concurrent-tcp-ip-connections – lsalamon

Trả lời

-5

Google xung quanh cho sự cố "C10K". Đây là cơ bản thảo luận và công nghệ xung quanh việc quản lý 10.000 hoặc nhiều hơn các kết nối đồng thời.

Tôi nghi ngờ con số này đã được chọn vì nó khó, nhưng về mặt lý thuyết có thể.

+52

đây không phải là một câu trả lời rất tốt vì nó: a) không trả lời câu hỏi. b) trên linux, có các thiết lập sysctl cụ thể có thể được điều chỉnh như net.core.somaxconn, cài đặt hàng đợi nghe tối đa. Ngoài ra còn có giới hạn về số lượng mô tả tệp mở. và c) vấn đề c10k không rõ ràng và phần lớn thông tin có sẵn trên đó là lý thuyết cao hoặc liên quan đến toàn bộ chồng. –

+2

Đây là một câu trả lời mơ hồ. Làm thế nào ai đó có thể chấp nhận câu trả lời như vậy. – Juvenik

20

Điều này không chỉ phụ thuộc vào hệ điều hành được đề cập, mà còn phụ thuộc vào cấu hình, cấu hình thời gian thực có khả năng.

Đối với Linux:

cat /proc/sys/fs/file-max 

sẽ hiển thị số lượng tối đa hiện tại của file descriptor tổng phép được mở cùng một lúc. Hãy xem http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html

+1

Chỉ cần kiểm tra máy tính xách tay ubuntu (13.04) của tôi ... 386491. Tôi nghi ngờ đây sẽ là giới hạn đầu tiên tôi sẽ chạy vào. – Gerry

-8

Thực tế cho một ứng dụng, sau đó 4000-5000 ổ cắm mở trên một máy trở nên không thực tế. Chỉ cần kiểm tra hoạt động trên tất cả các ổ cắm và quản lý chúng bắt đầu trở thành vấn đề hiệu suất - đặc biệt là trong môi trường thời gian thực.

+2

Tuyên bố quá rộng. Trong thực tế, tất cả phụ thuộc vào những gì bạn đang làm ở lớp ứng dụng; đó sẽ là nút cổ chai hiệu suất của bạn trong hầu hết các trường hợp. – DarkSquid

1

Hệ điều hành nào?

Đối với máy windows, nếu bạn đang viết một máy chủ để mở rộng tốt, và do đó sử dụng Cổng kết thúc I/O và I/O không đồng bộ, thì giới hạn chính là số lượng nhóm không được phân trang mà bạn đang sử dụng cho mỗi kết nối hoạt động. Điều này dịch trực tiếp vào một giới hạn dựa trên số lượng bộ nhớ mà máy của bạn đã cài đặt (nhóm không phân trang là số lượng kích thước cố định hữu hạn dựa trên tổng bộ nhớ đã cài đặt). Đối với các kết nối không thấy nhiều lưu lượng truy cập, bạn có thể giảm hiệu quả bằng cách đăng 'số lần đọc byte không' không sử dụng nhóm không được phân trang và không ảnh hưởng đến giới hạn các trang bị khóa (một tài nguyên giới hạn tiềm ẩn khác). có thể ngăn bạn mở nhiều kết nối socket). Ngoài ra, tốt, bạn sẽ cần phải hồ sơ nhưng tôi đã quản lý để có được hơn 70.000 kết nối đồng thời trên một máy chủ (760MB bộ nhớ) khiêm tốn quy định; xem tại đây http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html để biết thêm chi tiết.

Rõ ràng nếu bạn đang sử dụng kiến ​​trúc kém hiệu quả hơn như 'luồng cho mỗi kết nối' hoặc 'chọn' thì bạn nên mong đợi để đạt được những con số ít ấn tượng hơn; nhưng, IMHO, đơn giản là không có lý do gì để chọn các kiến ​​trúc như vậy cho các máy chủ socket của Windows.

Chỉnh sửa: xem tại đây http://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx; cách mà số lượng hồ bơi không được phân trang được tính toán đã thay đổi trong Vista và Server 2008 và giờ đây có nhiều khả năng hơn.

+0

Hmm. Hấp dẫn. Với 128mb hồ bơi không được phân trang trên W2K, với IOCP, tôi có thể duy trì các ổ cắm * hoạt động 4.000 * (ví dụ: đồng thời phát trực tuyến). Khi những ổ cắm này không hoạt động, tôi có thể duy trì khoảng 16.000. Tôi đoán ổ cắm của bạn đang nhàn rỗi và/hoặc không đọc được vé đọc byte này. –

+0

Xác định hoạt động. Bạn đang chạy ứng dụng thử nghiệm trên một máy khác? Bạn đang quản lý lượng dữ liệu bạn đang gửi bằng một số hình thức kiểm soát luồng? Ổ cắm của tôi đã lặp lại các tin nhắn, nhưng không sử dụng số không đọc byte. Họ đã không chạy phẳng và streaming dữ liệu càng nhanh càng tốt. –

+0

Tôi nghĩ bạn chỉ có thể nhận được kết nối 65k trên Windows - bạn phải chỉnh sửa cài đặt đăng ký tcpnumconnections. (và trên XP họ giới hạn nó hơn nữa trong tcpip.sys, có rất nhiều nói về điều này trên các trang web bittorrent) – gbjbaanb

5

Trên Linux, bạn nên xem xét sử dụng epoll cho I/O không đồng bộ. Nó cũng có thể là giá trị tinh chỉnh bộ đệm ổ cắm để không lãng phí quá nhiều không gian hạt nhân cho mỗi kết nối.

Tôi đoán bạn sẽ có thể tiếp cận 100k kết nối trên một máy hợp lý.

8

10.000? 70.000?FreeBSD có lẽ là máy chủ bạn muốn, Dưới đây là một số little blog post về điều chỉnh nó để xử lý 100.000 kết nối, nó đã có một số tính năng thú vị như ổ cắm không sao chép trong một thời gian, cùng với kqueue để hoạt động như một cơ chế cổng hoàn thành.

Solaris can handle 100,000 connections vào thế kỷ trước !. Họ nói rằng linux sẽ tốt hơn

Mô tả hay nhất mà tôi đã xem là bản trình bày/bài viết này về cách viết một máy chủ web có thể mở rộng. Anh ấy không ngại để nói nó như nó là :)

Tương tự cho phần mềm: Crétins trên lớp ứng dụng buộc lớn đổi mới trên lớp hệ điều hành. Bởi vì Lotus Notes giữ một kết nối TCP mỗi khách hàng mở, IBM đóng góp lớn tối ưu hóa cho cơ chế “một quá trình, 100.000 kết nối mở” trường hợp sang Linux

Và O (1) lịch trình ban đầu tạo ra để đạt điểm cao trên một số điểm chuẩn Java không liên quan. Dòng dưới cùng là dòng là tất cả của số này là chúng tôi.

+2

Tôi dừng lại ở mức 70.000 vì khách hàng của tôi nhiều hơn yêu cầu của tôi; vì vậy kiểm tra đã được thông qua. Với những thay đổi về cách giới hạn hồ bơi không phân trang được tính toán, tôi sẽ tưởng tượng rằng một máy chủ Windows 2008 sẽ không có vấn đề với 100.000 kết nối. –

+0

Bạn có thể chia sẻ liên kết đến bản trình bày mà bạn đã trích dẫn không? –

+1

@BrianCline Bạn có lẽ không cần điều này nữa, nhưng tôi cũng muốn nó và tôi nghĩ rằng tôi tìm thấy nó: https://www.slideshare.net/Arbow/scalable-networking (slide 33) – Piyin

3

tùy thuộc vào ứng dụng. nếu chỉ có một vài gói từ mỗi máy khách, 100K là rất dễ dàng cho Linux. Một kỹ sư của nhóm của tôi đã thực hiện một thử nghiệm năm trước, kết quả cho thấy: khi không có gói nào từ khách hàng sau khi kết nối được thiết lập, Linux epoll có thể xem 400k fd để có thể đọc ở mức sử dụng CPU dưới 50%.

75

Tôi đã đạt được 1600k kết nối ổ cắm nhàn rỗi đồng thời, và đồng thời 57k req/s trên máy tính để bàn Linux (RAM 16G, CPU I7 2600). Đó là một máy chủ http chủ đề được viết bằng C với epoll. Mã nguồn nằm trên github, một blog here.

Edit:

tôi đã 600k kết nối HTTP đồng thời (client & server) trên cả hai cùng một máy tính, với JAVA/Clojure. Thông tin chi tiết post, HN thảo luận: http://news.ycombinator.com/item?id=5127251

Chi phí của một kết nối (với epoll):

  • ứng dụng cần một số RAM cho mỗi kết nối
  • TCP đệm 2 * 4k ~ 10k, hoặc nhiều
  • epoll cần một số bộ nhớ cho một bộ mô tả tập tin, từ epoll (7)

Mỗi tập tin mô tả tập tin đã đăng ký sts khoảng 90 byte trên hạt nhân 32 bit và khoảng 160 byte trên hạt nhân 64 bit.

+3

1 triệu hộp duy nhất, xem http://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ – leef

+13

@leef 1600k là 1,6 triệu ... – wallacer

+2

hahaha ... 10 triệu kết nối http: //highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html – Lothar

0

Giới hạn về số lượng ổ cắm mở là cấu hình trong hệ thống tập tin/proc

cat /proc/sys/fs/file-max 

Max cho đến kết nối trong hệ điều hành được xác định bằng cách giới hạn số nguyên.

Bản thân Linux cho phép hàng tỷ ổ cắm mở.

Để sử dụng các ổ cắm bạn cần một ứng dụng đang nghe, ví dụ: một máy chủ web và điều đó sẽ sử dụng một lượng RAM nhất định trên mỗi socket.

RAM và CPU sẽ giới thiệu các giới hạn thực. (hiện tại năm 2017, hàng triệu tỷ không phải là hàng tỷ)

1 triệu người có thể, không dễ dàng. Mong đợi sử dụng X Gigabyte RAM để quản lý 1 triệu ổ cắm.

Thư đi Kết nối TCP bị giới hạn bởi số cổng ~ 65000 trên IP. Bạn có thể có nhiều địa chỉ IP, nhưng không phải địa chỉ IP không giới hạn. Đây là giới hạn trong TCP chứ không phải Linux.

Các vấn đề liên quan