簡體   English   中英

linux下的TCP / UDP高性能服務器

[英]TCP/UDP high-performance server under linux

我想了解一些使用多線程的高性能服務器程序的問題。

  1. epoll可以處理TCP套接字監聽和套接字連接,我可以在主線程中使用epoll_wait,如果有任何套接字連接,程序可以接受工作線程中的連接和recv數據。 工作線程之間沒有沖突。 我對嗎?

    udp是一個無連接協議,我們可以同時在所有工作線程中使用recvfrom函數嗎? 主線程只是使用epoll來注意工作線程接收數據。 (假設我可以單獨處理每個UDP數據包)。

  2. 這是一個UDP服務器。 我設置它使用非阻塞套接字。 我在主線程中接收數據並處理它,然后將其發送到任務隊列,如果任務隊列有數據,程序喚醒工作線程並鎖定任務隊列,然后從任務隊列中獲取數據,解鎖任務隊列,以便其他工作線程可以從任務隊列中獲取任務,然后處理它。

    這是一個很好的多線程UDP服務器嗎?我不確定。 還有另一種具有高性能的UDP服務器設計。

    我對這個問題感到困惑,非常感謝!

你的基本方法是對的。 首先研究臭名昭着的C10K問題及其如何克服。 一旦了解了各種實現中的主要瓶頸,就需要將以下內容作為設計過程的一部分:

  • 最小化線程創建/刪除周期。
  • 始終在阻塞模型上選擇“基於事件”的模型。

基本上, 每個請求的單線程模型因其簡單的實現而是優選的。 但它並不能很好地適應並發請求的數量。 在設計支持超過幾千個並發請求所需的系統時,人們更喜歡在線程上使用套接字。

要實例化的“工作線程”的最佳數量取決於:

  • 加載 (並發請求數)
  • 系統 (CPU,RAM)

由於這是實現Web服務器設計時非常流行的問題,因此您可以通過簡單地搜索Apache與Nginx來找到類似這樣的分析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM