测试目的: 证明epoll和poll在应用层相同的使用条件下,epoll的开销要明显的小于poll
Epoll采用ET模式
测试方法:
服务端,对连接过来的n个客户端只读取数据,系统调用只有poll和read, 或者epoll_wait和read, 便于分析。为了poll和epoll_wait调用的次数相等的目的,poll和epoll进程都采用相同的read策略, 即读取fd发生EAGIAN或者读取的实际数据小于读取空间的数据。均采用非堵塞io
客户端,采用长连接接入后, 不断发送数据, 采用堵塞方式。
测试行为:
客户端采用40个线程,不间断发送100字节,可以观察到网卡已经被占满
Iptraf检测到
Poll流量: 95165 kbits/s
Epoll流量: 97950 kbis/s
Poll:
系统调用占据了绝大多数的时间, 空闲很少
10:51:38 AM CPU %user %nice %system %idle intr/s
10:51:39 AM all 2.00 0.00 78.00 20.00 12362.00
10:51:40 AM all 2.00 0.00 75.00 23.00 12366.00
10:51:41 AM all 4.00 0.00 74.00 22.00 12355.00
10:51:42 AM all 0.00 0.00 83.00 17.00 12352.00
10:51:43 AM all 2.00 0.00 77.00 21.00 12341.00
10:51:44 AM all 4.00 0.00 80.00 16.00 12348.00
10:51:45 AM all 2.00 0.00 78.00 20.00 12350.00
10:51:46 AM all 1.00 0.00 82.00 17.00 12360.00
10:51:47 AM all 2.00 0.00 80.00 18.00 12365.00
10:51:48 AM all 4.00 0.00 82.00 14.00 12305.00
10:51:49 AM all 3.00 0.00 82.00 15.00 12309.00
10:51:50 AM all 2.00 0.00 81.00 17.00 12338.00
10:51:51 AM all 5.00 0.00 77.00 18.00 12339.00
10:51:52 AM all 2.00 0.00 80.00 18.00 12205.00
10:51:53 AM all 3.00 0.00 71.00 26.00 12324.00
10:51:54 AM all 2.00 0.00 74.00 24.00 12424.00
10:51:55 AM all 1.00 0.00 79.00 20.00 12356.00
10:51:56 AM all 3.00 0.00 78.00 19.00 12342.00
10:51:57 AM all 5.00 0.00 74.00 21.00 12337.00
10:51:58 AM all 2.00 0.00 79.00 19.00 12342.00
10:51:59 AM all 2.00 0.00 79.00 19.00 12336.00
10:52:00 AM all 6.00 0.00 70.00 24.00 12330.00
10:52:01 AM all 6.00 0.00 74.00 20.00 12334.00
10:52:02 AM all 3.00 0.00 74.00 23.00 12332.00
10:52:03 AM all 2.00 0.00 77.00 21.00 12374.00
10:52:04 AM all 3.00 0.00 77.00 20.00 12332.00
10:52:05 AM all 0.00 0.00 78.00 22.00 12339.00
10:52:06 AM all 0.00 0.00 80.00 20.00 12345.00
10:52:07 AM all 5.00 0.00 75.00 20.00 12355.00
10:52:08 AM all 3.00 0.00 77.00 20.00 12349.00
10:52:09 AM all 1.00 0.00 81.00 18.00 12350.00
10:52:10 AM all 3.00 0.00 76.00 21.00 12349.00
10:52:11 AM all 8.00 0.00 74.00 18.00 12376.00
Epoll:
10:55:30 AM CPU %user %nice %system %idle intr/s
10:55:31 AM all 2.00 0.00 23.00 75.00 12333.00
10:55:32 AM all 3.00 0.00 23.00 74.00 12374.00
10:55:33 AM all 3.00 0.00 24.00 73.00 12334.00
10:55:34 AM all 1.00 0.00 24.00 75.00 12352.00
10:55:35 AM all 5.00 0.00 21.00 74.00 12389.00
10:55:36 AM all 2.00 0.00 24.00 74.00 12351.00
10:55:37 AM all 2.00 0.00 25.00 73.00 12353.00
10:55:38 AM all 2.00 0.00 24.00 74.00 12341.00
10:55:39 AM all 2.00 0.00 24.00 74.00 12355.00
10:55:40 AM all 4.00 0.00 26.00 70.00 12370.00
10:55:41 AM all 2.00 0.00 24.00 74.00 12343.00
10:55:42 AM all 2.00 0.00 30.00 68.00 12337.00
10:55:43 AM all 0.00 0.00 26.00 74.00 12340.00
10:55:44 AM all 1.00 0.00 25.00 74.00 12341.00
10:55:45 AM all 0.00 0.00 26.00 74.00 12353.00
10:55:46 AM all 1.00 0.00 18.00 81.00 12346.00
10:55:47 AM all 1.00 0.00 27.00 72.00 12377.00
10:55:48 AM all 1.00 0.00 24.00 75.00 12361.00
10:55:49 AM all 1.00 0.00 27.00 72.00 12348.00
10:55:50 AM all 1.00 0.00 25.00 74.00 12345.00
10:55:51 AM all 1.00 0.00 30.00 69.00 12342.00
10:55:52 AM all 1.00 0.00 29.00 70.00 12343.00
10:55:53 AM all 2.00 0.00 23.00 75.00 12334.00
10:55:54 AM all 2.00 0.00 23.00 75.00 12340.00
10:55:55 AM all 2.00 0.00 21.00 77.00 12367.00
10:55:56 AM all 1.00 0.00 27.00 72.00 12363.00
10:55:57 AM all 1.00 0.00 23.00 76.00 12349.00
10:55:58 AM all 2.00 0.00 21.00 77.00 12340.00
10:55:59 AM all 1.00 0.00 22.00 77.00 12342.00
10:56:00 AM all 1.00 0.00 27.00 72.00 12352.00
10:56:01 AM all 2.00 0.00 24.00 74.00 12357.00
10:56:02 AM all 1.00 0.00 28.00 71.00 12346.00
10:56:03 AM all 3.00 0.00 24.00 73.00 12314.00
Top:
Poll:
22105 loki 16 0 852 848 756 R 56.9 0.3 1:07 0 pollserver
21802 loki 9 0 608 608 552 S 0.9 0.2 0:00 0 mpstat
Epoll:
22108 loki 14 0 904 900 808 R 9.9 0.3 0:24 0 epollserver
22110 loki 11 0 1168 1168 884 R 0.5 0.4 0:00 0 top
Strac
Poll的系统调用统计结果:
strace -c ./pollserver
execve("./pollserver", ["./pollserver"], [/* 28 vars */]) = 0
ServerTest listen success!
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
54.95 8.240026 74 111511 poll
45.03 6.751312 19 347887 read
Epoll的系统调用统计结果:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
55.78 9.780626 30 323798 epoll_wait
44.20 7.749433 12 654077 read
Poll和epoll的I/O复用函数的调用比例基本是一致的,流量也是一样的,基本将网卡塞满
但是观察top,和mpstat的结果, 明显epoll的系统调用要强于poll