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
-
1gdb –ex “set pagination 0” –ex “thread apply all bt” <br /> —batch –p $(pidof mysqld)<span style=“font-family: “times new roman“;”><span style=“white-space: normal;”><br /></span></span>
Leave a Reply