Windows下兩種iocp實現的差距
之前幾天說過,因為經典iocp實現(以下簡稱經典實現)多個io線程綁定在一個iocp上,這樣內部管理了iocp隊列的處理,內部決定是不是需要線程切換,我上次修改的一個版本(以下簡稱實現2),用了多個io線程,每個iocp隊列僅綁定一個io線程,一組用戶共享一個io線程,這和經典的多線程epoll模型的做法是很相似的,這樣每個io線程是可以獨立控制了,但理論上這種做法沒有發揮iocp自動管理線程切換的優勢,昨晚沒事用這兩種實現分別做了個echoserver測試了一下,這兩套實現代碼僅40行左右不同,其他完全一樣,效果真的是差很多,測試僅用一個進程模擬了4000個客戶端,每秒1個包,先看實現2的,cpu占14%,2個io線程,1個accept線程,1個主線程,其他線程都沒干活閑置。
Cpu |
Memory |
Threads |
handles |
14 |
40088k |
8 |
4236 |
Cpu |
Memory |
Threads |
handles |
0 |
39244k |
7 |
4336 |
說實話,在測試之前我也沒想到有這么大的差距,經典實現就是1.2w個連接連上來還是這樣,就是內存占用多一點:
Cpu |
Memory |
Threads |
handles |
0 |
112068k |
7 |
12280 |
習慣上總有人喜歡拿epoll和iocp來對比,我到現在也沒看到真正公平的對比,就算是相對公平的也沒見到,因為在我看來,要對比硬件應該是一樣的,os都應該是最新的,最重要的是,server端程序應該都是發揮了各自優勢的,如果拿我這里的實現2去代表iocp的水平和epoll對比,勢必造成比epoll差很多的結果,然而這顯然是不正確的。
epoll經典多線程模式實際實現和實現2很相似,理論上也有類似的線程切換問題,不知道效率怎樣。