你應該去搜一下c10k問題。過去十年,大家重點解決的是c10k問題。簡單說就是單機維持一萬連線。這在十幾年前基本上是沒法實現的。後來隨著硬體效能的提升(多核)和作業系統的升級(select,poll,epoll),今天單機百萬連線已不是問題。五年前阿里透過修改核心驅動,已經實現了單機千萬連線,開始著手解決c10m的問題了。
今天我們看到的nginx,redis,kafka,所有高效能的中介軟體,還有netty等網路程式設計框架,基本上都利用了作業系統的epoll和零複製等功能特性。
如果你真的想了解你問的這些問題,建議重點了解下一個網路包從網絡卡接受到程式之間到底發生了什麼。可以從硬體維度,程序呼叫維度和記憶體維度來分析。這裡面主要是看核心如何處理資料包。
1,一個數據包從網絡卡接收後,核心如何收到包一步步處理並呼叫應用程式的?簡單說是網絡卡透過DMA直接複製到記憶體,核心從記憶體複製到socket緩衝區,然後通知應用程式取。而這個通知應用程式取的方式,由十幾年前的阻塞方式,過度到select方式,到今天的epoll方式。
2,應用程式如何取這些網路包的呢?十幾年前的方案是從核心空間複製到使用者空間,但是大家覺得每次切換比較耗時,所以作業系統發明了mmap和sendfile,實現了零複製。
更詳細的原理建議自己去網上找找資料吧~
你應該去搜一下c10k問題。過去十年,大家重點解決的是c10k問題。簡單說就是單機維持一萬連線。這在十幾年前基本上是沒法實現的。後來隨著硬體效能的提升(多核)和作業系統的升級(select,poll,epoll),今天單機百萬連線已不是問題。五年前阿里透過修改核心驅動,已經實現了單機千萬連線,開始著手解決c10m的問題了。
今天我們看到的nginx,redis,kafka,所有高效能的中介軟體,還有netty等網路程式設計框架,基本上都利用了作業系統的epoll和零複製等功能特性。
如果你真的想了解你問的這些問題,建議重點了解下一個網路包從網絡卡接受到程式之間到底發生了什麼。可以從硬體維度,程序呼叫維度和記憶體維度來分析。這裡面主要是看核心如何處理資料包。
1,一個數據包從網絡卡接收後,核心如何收到包一步步處理並呼叫應用程式的?簡單說是網絡卡透過DMA直接複製到記憶體,核心從記憶體複製到socket緩衝區,然後通知應用程式取。而這個通知應用程式取的方式,由十幾年前的阻塞方式,過度到select方式,到今天的epoll方式。
2,應用程式如何取這些網路包的呢?十幾年前的方案是從核心空間複製到使用者空間,但是大家覺得每次切換比較耗時,所以作業系統發明了mmap和sendfile,實現了零複製。
更詳細的原理建議自己去網上找找資料吧~