2016-08-02 epoll 與 timeout

Sasha Pivovarova

翻譯

持續暫停中 Q_________Q
看了文章後才發現,原來大家英文都很好,可以直接看懂文章。
要不然怎麼會到現在都沒有翻譯的文章呢。
一定是我功力太弱了,要加強!

Linux epoll

epoll 是一個 Linux 上 select 與 poll 的替代品,其他平台可以參看 /dev/poll 與 kqueue。
會碰到這個是因為還在看昨天的 server-framework,目前大致上了解 epoll 的用途。
不過在搞懂用途之前,一直狀牆。原因有兩個,一個是對 socket 不熟,一個是因為對 http 不熟。
有關 socket 的部份,最後是靜下心來看了這篇文章後,跟著一個一個做才了解要怎麼在 Linux 上 控制 socket。
有關 http 的部份,看了一下 http keep-alive 的東西。

有關 epoll 的部份,參考了許多的文章如
https://segmentfault.com/a/1190000003063859 (參考程式碼, 理解不同 I/O 模式)

  • epoll_create 大致上就是建立一個 epoll fd 出來。
  • epoll_ctl 有三種 opt,ADD/MOD/DEL 可以使用
  • epoll_wait 會回傳 timeout 內所有進來的 event,timeout可以設定為 -1,就是 block 到有新連線進來為止。
今天最後卡在自己建立的 epoll model 並不能夠從 apache benchmark 中獲得結果
下了 ab -c 5 -n 10 http://127.0.0.1:8080/ 的結果只有

Benchmarking 127.0.0.1 (be patient)…apr_pollset_poll: The timeout specified has expired (70007)

最後了解到,是因為 epoll 並沒有維護 socket 的 timeout ,導致沒有人去關閉 socket 連線,而 ab 因此 timeout。

現在的解法是維護一個 fd 的 timeout table ,如果 timeout 的話就把 socket 關閉。這樣雖然讓 ab 可以測試成功,但是卻也犧牲了原本 epoll 想要做到的事情 – 不要去 iteration 一個表。

code 可以看這邊:https://github.com/grapherd/server-framework/blob/epoll/playground/ep.c
想法來源看這邊:http://stackoverflow.com/questions/10772208/epoll-and-timeouts

了解以後,明天回頭去看 reactor pattern,這邊 有提到現在 server 都是專注在不同 I/O pattern 上來加速。

gdb 技巧 *2

1. gdb 可以看 structure member
  • p *variable 就行了
  • 太醜? set print pretty on
2. gdb 可以當窮人的 thread analyzer



如果你覺得這篇文章不錯,歡迎打賞 IOTA:RFHEIVXVIZWJFXTZORZZRCMHZF9PSGFUFWAAKXTFNZE9JQUY9HFQREJYYSPSXDRLECKXCAQQDOMSMYJYDKPCKWXBKD

或是點選下方圖片贊助我一杯咖啡:

Leave a reply:

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.