異步IO比同步阻塞IO性能更好嗎?爲何?

最近在看node.js, 介紹中提到node是異步io的方式實現, 性能比同步阻塞io的更好. 對於一個request而言, 若是咱們依賴io的結果, 異步io和同步阻塞io都是要等到io完成才能繼續執行. 而同步阻塞io, 一旦阻塞就不會在得到cpu時間片, 那麼爲何異步的性能更好呢?node

這個問題以前在作Servlet AIO優化的時候就沒想太明白. 如今回想起來tomcat這類server的BIO併發數是有瓶頸的, 即使是空跑也只能到1000個併發量級, 而Nginx能夠作到C10k. 問題其實就出在線程的數量上面.tomcat

同步io模型須要對每一個請求建立一個線程, 在io時, 線程被block住, 雖然不消耗cpu, 但線程自己是有內存開銷的. 雖然建立少許線程的開銷在現代操做系統中很低, 可是這個量到達10k的併發以後, 這個量就很大了. 其次, 活躍線程的context switch開銷也會消耗額外的cpu資源.多線程

而異步模型只建立固定的線程, (通常等於cpu核數), 處理併發的請求, 在io的地方用操做系統提供的異步io實現, 避免了線程頻繁建立, 銷燬和context switch的開銷. 所以更快. 這裏的快是指吞吐量更大, cpu資源的更有效利用.併發

有一點也須要注意, 就是從request進來到完成, 應用內各個節點和調用流程都要支持異步io調用, 不然一個節點不支持, 就退化成多線程的解決方式. 好比Servlet -> JDK -> 操做系統, 每一個環節都要作異步的支持.異步

最後說下同步, 異步, 阻塞, 非阻塞幾點的區別.性能

同步異步是在調用的角度上面看, 同步是調用方主動完成操做. 而異步是在調用完成後, 被調用方執行回調完成操做.優化

阻塞非阻塞是指執行線程有沒有中止執行, 阻塞是線程block住再也不得到cpu時間片, 非阻塞是指線程仍是active的, 能夠繼續得到時間片, 執行其餘任務.操作系統

相關文章
相關標籤/搜索