tối ưu hóa máy chủ Linux của tôi để xử lý 10.000 luồng trên mỗi tiến trình
Như những người khác giải thích, điều này nói chung là sai. Một luồng là một tài nguyên tốn kém , đáng chú ý là vì nó có ngăn xếp cuộc gọi riêng của nó (thường là một megabyte) và bởi vì nó là một tác vụ được lên lịch bởi kernel. Chủ đề thậm chí còn tốn kém hơn so với mô tả tập tin mở .
Đọc hệ điều hành: Three Easy Pieces (sách giáo khoa có thể tải xuống miễn phí).
Theo nguyên tắc thông thường, bạn không muốn có nhiều chủ đề và chắc chắn không có nhiều chủ đề có thể chạy được. Số lượng các luồng có thể chạy thường nên nhiều nhất là số lõi (hoặc một bội số nhỏ trong số đó), vì vậy nhiều nhất là khoảng một chục. Số lượng chủ đề trong một quy trình có thể lớn hơn một chút. Vì vậy, trừ khi bạn có một máy chủ rất rộng (có nhiều ổ cắm và lõi xử lý), bạn không muốn có hơn một chục luồng có thể chạy được và hàng trăm luồng (hầu hết chúng đều ở chế độ chờ) trên máy tính của bạn (trên máy tính để bàn của bạn) .
Trên Linux, các luồng và tiến trình rất giống nhau (vì cả hai có thể được tạo bởi clone (2) ) và cả hai đều là các tác vụ được lên lịch bởi kernel. Trên thực tế, bộ lập lịch kernel đang lên lịch các tác vụ có thể là các luồng trong một quy trình đa luồng hoặc luồng chính của một tiến trình đơn luồng (trong trường hợp đó, bạn sẽ đặt tên là "xử lý" luồng đơn đó) hoặc các luồng nhân. Bạn có thể không muốn có tổng cộng hơn một nghìn nhiệm vụ có thể lập lịch trên hệ thống máy tính để bàn của mình.
Trên Linux, một quy trình chỉ đơn giản là một nhóm các luồng chia sẻ cùng một không gian địa chỉ ảo (và chia sẻ một số thứ khác, chẳng hạn như bảng mô tả tệp, v.v ...). Một số quy trình chỉ có một luồng.
Một không gian địa chỉ ảo được định nghĩa bởi Wikipedia như
"tập hợp các dải địa chỉ ảo mà hệ điều hành cung cấp cho một tiến trình"
(nhưng cũng xem câu trả lời này giải thích rằng thuật ngữ này không phổ biến và một số tài liệu của Microsoft sử dụng một định nghĩa khác và không tương thích ).
Trên Linux, Proc (5) rất hữu ích để hiểu không gian địa chỉ ảo của một số quy trình. Hãy thử cả hai
cat /proc/self/maps
và cat /proc/$$/maps
trong một thiết bị đầu cuối. Xem thêm điều này và pmap (1) & ps (1) & top (1) .
Tất cả các chương trình không gian người dùng đang chạy trong một số quy trình và sử dụng bộ nhớ ảo để mọi quy trình có không gian địa chỉ ảo riêng. Vật lý RAM là một nguồn lực bởi hạt nhân Linux được quản lý, và các ứng dụng không có quyền truy cập trực tiếp vào bộ nhớ RAM (trừ bởi mmap (2) -ing /dev/mem
, xem mem (4) ).
Vì vậy, một quá trình không sử dụng RAM trực tiếp . Nó sử dụng bộ nhớ ảo và có không gian địa chỉ ảo riêng. Các hạt nhân sử dụng được phân trang để quản lý RAM vật lý trang và cung cấp không gian địa chỉ ảo và quá trình trừu tượng . Bất cứ lúc nào (ngay cả khi quá trình của bạn không hoạt động hoặc khi nó đang chạy), kernel có thể thoát ra một số trang (ví dụ: trao đổi chúng trên đĩa). Hạt nhân đang cấu hình MMU (và trang xử lý bỏ qua các ngoại lệ phần cứng trong một số trình xử lý ngắt , bằng cách tìm nạp trang từ đĩa hoặc bằng cách truyền lỗi phân đoạn cho quy trình, xem tín hiệu (7) )
Bạn có thể có các luồng màu xanh lá cây phía trên các luồng hệ thống (nhưng các thư viện luồng xanh rất khó thực hiện và gỡ lỗi). Nhìn vào những con khỉ đột được sử dụng trong Go cho một ví dụ lạ mắt. Xem thêm setcontext (3) .
Đôi khi, hệ thống của bạn có thể thử nghiệm đập . Điều này xảy ra khi tổng bộ nhớ ảo (cần thiết cho tất cả các quy trình) vượt quá - một yếu tố lớn - RAM vật lý khả dụng. Sau đó, máy tính của bạn trở nên không phản hồi. Đọc về kích thước tập hợp cư dân , phân trang theo yêu cầu , bộ làm việc , bộ nhớ thừa , ASLR .
Xem thêm -ví Linux- fork (2) , bản sao (2) , mmap (2) , madvise (2) , posix_fadvise (2) , mlock (2) , execve (2) , thông tin (7) , pthreads (7) , Futex (7) , khả năng (7) .