{"id":201461,"date":"2025-05-10T11:54:18","date_gmt":"2025-05-10T03:54:18","guid":{"rendered":"https:\/\/server.hk\/cnblog\/201461\/"},"modified":"2025-05-10T11:54:18","modified_gmt":"2025-05-10T03:54:18","slug":"%e4%b8%80%e6%96%87%e8%af%a6%e8%a7%a3redis%e5%9c%a8%e4%b8%87%e4%ba%bf%e7%ba%a7%e6%97%a5%e8%ae%bf%e9%97%ae%e9%87%8f%e4%b8%8b%e7%9a%84%e4%b8%ad%e6%96%ad%e4%bc%98%e5%8c%96","status":"publish","type":"post","link":"https:\/\/server.hk\/cnblog\/201461\/","title":{"rendered":"\u4e00\u6587\u8be6\u89e3Redis\u5728\u4e07\u4ebf\u7ea7\u65e5\u8bbf\u95ee\u91cf\u4e0b\u7684\u4e2d\u65ad\u4f18\u5316"},"content":{"rendered":"<p><b><\/b> <\/p>\n<h1>\u4e00\u6587\u8be6\u89e3Redis\u5728\u4e07\u4ebf\u7ea7\u65e5\u8bbf\u95ee\u91cf\u4e0b\u7684\u4e2d\u65ad\u4f18\u5316<\/h1>\n<p><span style=\"cursor: pointer\"><i><\/i>\u6536\u85cf<\/span> <\/p>\n<p>\u672c\u7bc7\u6587\u7ae0\u4e3b\u8981\u662f\u7ed3\u5408\u6211\u4e4b\u524d\u9762\u8bd5\u7684\u5404\u79cd\u7ecf\u5386\u548c\u5b9e\u6218\u5f00\u53d1\u4e2d\u9047\u5230\u7684\u95ee\u9898\u89e3\u51b3\u7ecf\u9a8c\u6574\u7406\u7684\uff0c\u5e0c\u671b\u8fd9\u7bc7\u300a\u4e00\u6587\u8be6\u89e3Redis\u5728\u4e07\u4ebf\u7ea7\u65e5\u8bbf\u95ee\u91cf\u4e0b\u7684\u4e2d\u65ad\u4f18\u5316\u300b\u5bf9\u4f60\u6709\u5f88\u5927\u5e2e\u52a9\uff01\u6b22\u8fce\u6536\u85cf\uff0c\u5206\u4eab\u7ed9\u66f4\u591a\u7684\u9700\u8981\u7684\u670b\u53cb\u5b66\u4e60~<\/p>\n<p>2017 \u5e74\u5e74\u521d\u4ee5\u6765\uff0c\u968f\u7740 Redis \u4ea7\u54c1\u7684\u7528\u6237\u91cf\u8d8a\u6765\u8d8a\u5927\u3001\u63a5\u5165\u670d\u52a1\u8d8a\u6765\u8d8a\u591a\uff0c\u518d\u52a0\u4e0a\u7f8e\u56e2\u70b9\u8bc4 Memcache \u548c Redis \u4e24\u5957\u7f13\u5b58\u878d\u5408&#8230;&#8230;<\/p>\n<\/p>\n<p>\u8fd9\u5bfc\u81f4 Redis \u670d\u52a1\u7aef\u7684\u603b\u4f53\u8bf7\u6c42\u91cf\u4ece\u5e74\u521d\u6700\u5f00\u59cb\u65e5\u8bbf\u95ee\u91cf\u767e\u4ebf\u6b21\u7ea7\u522b\u4e0a\u6da8\u5230\u9ad8\u5cf0\u65f6\u6bb5\u7684\u4e07\u4ebf\u6b21\u7ea7\u522b\uff0c\u56e0\u6b64\u7ed9\u8fd0\u7ef4\u548c\u67b6\u6784\u56e2\u961f\u90fd\u5e26\u6765\u4e86\u6781\u5927\u7684\u6311\u6218\u3002<\/p>\n<p>\u539f\u672c\u7a33\u5b9a\u7684\u73af\u5883\u4e5f\u56e0\u4e3a\u8bf7\u6c42\u91cf\u7684\u4e0a\u6da8\u5e26\u6765\u4e86\u5f88\u591a\u4e0d\u7a33\u5b9a\u7684\u56e0\u7d20\uff0c\u5176\u4e2d\u4e00\u76f4\u56f0\u6270\u6211\u4eec\u7684\u5c31\u662f\u7f51\u5361\u4e22\u5305\u95ee\u9898\u3002<\/p>\n<p>\u8d77\u521d\u7ebf\u4e0a\u5b58\u5728\u90e8\u5206 Redis \u8282\u70b9\u8fd8\u5728\u4f7f\u7528\u5343\u5146\u7f51\u5361\u7684\u8001\u65e7\u670d\u52a1\u5668\uff0c\u800c\u7f13\u5b58\u670d\u52a1\u5f80\u5f80\u9700\u8981\u627f\u8f7d\u6781\u9ad8\u7684\u67e5\u8be2\u91cf\uff0c\u5e76\u8981\u6c42\u6beb\u79d2\u7ea7\u7684\u54cd\u5e94\u901f\u5ea6\uff0c\u5982\u6b64\u4e00\u6765\u5343\u5146\u7f51\u5361\u5f88\u5feb\u5c31\u51fa\u73b0\u4e86\u74f6\u9888\u3002<\/p>\n<p>\u7ecf\u8fc7\u6574\u6cbb\uff0c\u6211\u4eec\u5c06\u5343\u5146\u7f51\u5361\u670d\u52a1\u5668\u66ff\u6362\u4e3a\u4e86\u4e07\u5146\u7f51\u5361\u670d\u52a1\u5668\u3002\u672c\u4ee5\u4e3a\u53ef\u4ee5\u9ad8\u6795\u65e0\u5fe7\uff0c\u4f46\u662f\u6ca1\u60f3\u5230\uff0c\u5728\u4e1a\u52a1\u9ad8\u5cf0\u65f6\u6bb5\uff0c\u673a\u5668\u7adf\u7136\u4e5f\u51fa\u73b0\u4e86\u4e22\u5305\u95ee\u9898\uff0c\u800c\u6b64\u65f6\u7f51\u5361\u5e26\u5bbd\u4f7f\u7528\u8fd8\u8fdc\u8fdc\u6ca1\u6709\u8fbe\u5230\u74f6\u9888\u3002<\/p>\n<p><strong><span style=\"font-size: x-large\">\u5b9a\u4f4d\u7f51\u7edc\u4e22\u5305\u7684\u539f\u56e0<\/span><\/strong><\/p>\n<p><strong><span style=\"font-size: large\">\u4ece\u5f02\u5e38\u6307\u6807\u5165\u624b<\/span><\/strong><\/p>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u5728\u7cfb\u7edf\u76d1\u63a7\u7684 net.if.in.dropped \u6307\u6807\u4e2d\uff0c\u770b\u5230\u6709\u5927\u91cf\u6570\u636e\u4e22\u5305\u5f02\u5e38\uff0c\u90a3\u4e48\u7b2c\u4e00\u6b65\u5c31\u662f\u8981\u4e86\u89e3\u8fd9\u4e2a\u6307\u6807\u4ee3\u8868\u4ec0\u4e48\u3002<\/p>\n<\/p>\n<p>\u8fd9\u4e2a\u6307\u6807\u7684\u6570\u636e\u6e90\uff0c\u662f\u8bfb\u53d6 \/proc\/net\/dev \u4e2d\u7684\u6570\u636e\uff0c\u76d1\u63a7 Agent \u505a\u7b80\u5355\u7684\u5904\u7406\u4e4b\u540e\u4e0a\u62a5\u3002<\/p>\n<p>\u4ee5\u4e0b\u4e3a \/proc\/net\/dev \u7684\u4e00\u4e2a\u793a\u4f8b\uff0c\u53ef\u4ee5\u770b\u5230\u7b2c\u4e00\u884c Receive \u4ee3\u8868 in\uff0cTransmit \u4ee3\u8868 out\uff0c\u7b2c\u4e8c\u884c\u5373\u5404\u4e2a\u8868\u5934\u5b57\u6bb5\uff0c\u518d\u5f80\u540e\u6bcf\u4e00\u884c\u4ee3\u8868\u4e00\u4e2a\u7f51\u5361\u8bbe\u5907\u5177\u4f53\u7684\u503c\u3002<\/p>\n<\/p>\n<p>\u5176\u4e2d\u5404\u4e2a\u5b57\u6bb5\u610f\u4e49\u5982\u4e0b\uff1a<\/p>\n<\/p>\n<p>\/proc\/net\/dev \u7684\u6570\u636e\u6765\u6e90\uff0c\u6839\u636e\u6e90\u7801\u6587\u4ef6 net\/core\/net-procfs.c\uff0c\u53ef\u4ee5\u77e5\u9053\u4e0a\u8ff0\u6307\u6807\u662f\u901a\u8fc7\u5176\u4e2d\u7684 dev_seq_show() \u51fd\u6570\u548c dev_seq_printf_stats() \u51fd\u6570\u8f93\u51fa\u7684\u3002<\/p>\n<p>\u901a\u8fc7\u4e0a\u8ff0\u5b57\u6bb5\u89e3\u91ca\uff0c\u6211\u4eec\u53ef\u4ee5\u4e86\u89e3\u4e22\u5305\u53d1\u751f\u5728\u7f51\u5361\u8bbe\u5907\u9a71\u52a8\u5c42\u9762\uff0c\u4f46\u662f\u60f3\u8981\u4e86\u89e3\u771f\u6b63\u7684\u539f\u56e0\uff0c\u9700\u8981\u7ee7\u7eed\u6df1\u5165\u6e90\u7801\u3002<\/p>\n<\/p>\n<pre>static&nbsp;int&nbsp;dev_seq_show(struct&nbsp;seq_file&nbsp;*seq,&nbsp;void&nbsp;*v)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(v&nbsp;==&nbsp;SEQ_START_TOKEN)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\u8f93\u51fa\/proc\/net\/dev\u8868\u5934\u90e8\u5206&nbsp;&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seq_puts(seq,&nbsp;\"Inter-|&nbsp;&nbsp;&nbsp;Receive&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;Transmitn\"&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"&nbsp;face&nbsp;|bytes&nbsp;&nbsp;&nbsp;&nbsp;packets&nbsp;errs&nbsp;drop&nbsp;fifo&nbsp;frame&nbsp;\"&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"compressed&nbsp;multicast|bytes&nbsp;&nbsp;&nbsp;&nbsp;packets&nbsp;errs&nbsp;\"&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"drop&nbsp;fifo&nbsp;colls&nbsp;carrier&nbsp;compressedn\");&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\u8f93\u51fa\/proc\/net\/dev\u6570\u636e\u90e8\u5206&nbsp;&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_seq_printf_stats(seq,&nbsp;v);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;\r\nstatic&nbsp;void&nbsp;dev_seq_printf_stats(struct&nbsp;seq_file&nbsp;*seq,&nbsp;struct&nbsp;net_device&nbsp;*dev)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;rtnl_link_stats64&nbsp;temp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;struct&nbsp;rtnl_link_stats64&nbsp;*stats&nbsp;=&nbsp;dev_get_stats(dev,&nbsp;&amp;temp);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\/proc\/net\/dev&nbsp;\u5404\u4e2a\u5b57\u6bb5\u7684\u6570\u636e\u7b97\u6cd5&nbsp;&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;seq_printf(seq,&nbsp;\"%6s:&nbsp;%7llu&nbsp;%7llu&nbsp;%4llu&nbsp;%4llu&nbsp;%4llu&nbsp;%5llu&nbsp;%10llu&nbsp;%9llu&nbsp;\"&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"%8llu&nbsp;%7llu&nbsp;%4llu&nbsp;%4llu&nbsp;%4llu&nbsp;%5llu&nbsp;%7llu&nbsp;%10llun\",&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev-&gt;name,&nbsp;stats-&gt;rx_bytes,&nbsp;stats-&gt;rx_packets,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;rx_errors,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;rx_dropped&nbsp;+&nbsp;stats-&gt;rx_missed_errors,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;rx_fifo_errors,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;rx_length_errors&nbsp;+&nbsp;stats-&gt;rx_over_errors&nbsp;+&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;rx_crc_errors&nbsp;+&nbsp;stats-&gt;rx_frame_errors,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;rx_compressed,&nbsp;stats-&gt;multicast,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;tx_bytes,&nbsp;stats-&gt;tx_packets,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;tx_errors,&nbsp;stats-&gt;tx_dropped,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;tx_fifo_errors,&nbsp;stats-&gt;collisions,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;tx_carrier_errors&nbsp;+&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;tx_aborted_errors&nbsp;+&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;tx_window_errors&nbsp;+&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;tx_heartbeat_errors,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;tx_compressed);<\/pre>\n<\/p>\n<p>dev_seq_printf_stats() \u51fd\u6570\u91cc\uff0c\u5bf9\u5e94 drop \u8f93\u51fa\u7684\u90e8\u5206\uff0c\u80fd\u770b\u5230\u7531\u4e24\u5757\u7ec4\u6210\uff1astats-&gt;rx_dropped+stats-&gt;rx_missed_errors\u3002<\/p>\n<p>\u7ee7\u7eed\u67e5\u627e dev_get_stats \u51fd\u6570\u53ef\u77e5\uff0crx_dropped \u548c rx_missed_errors \u90fd\u662f\u4ece\u8bbe\u5907\u83b7\u53d6\u7684\uff0c\u5e76\u4e14\u9700\u8981\u8bbe\u5907\u9a71\u52a8\u5b9e\u73b0\u3002<\/p>\n<\/p>\n<pre>&nbsp;*&nbsp;&nbsp;dev_get_stats&nbsp;&nbsp;&nbsp;-&nbsp;get&nbsp;network&nbsp;device&nbsp;statistics&nbsp;\r\n&nbsp;*&nbsp;&nbsp;@dev:&nbsp;device&nbsp;to&nbsp;get&nbsp;statistics&nbsp;from&nbsp;\r\n&nbsp;*&nbsp;&nbsp;@storage:&nbsp;place&nbsp;to&nbsp;store&nbsp;stats&nbsp;\r\n&nbsp;*&nbsp;&nbsp;Get&nbsp;network&nbsp;statistics&nbsp;from&nbsp;device.&nbsp;Return&nbsp;@storage.&nbsp;\r\n&nbsp;*&nbsp;&nbsp;The&nbsp;device&nbsp;driver&nbsp;may&nbsp;provide&nbsp;its&nbsp;own&nbsp;method&nbsp;by&nbsp;setting&nbsp;\r\n&nbsp;*&nbsp;&nbsp;dev-&gt;netdev_ops-&gt;get_stats64&nbsp;or&nbsp;dev-&gt;netdev_ops-&gt;get_stats;&nbsp;\r\n&nbsp;*&nbsp;&nbsp;otherwise&nbsp;the&nbsp;internal&nbsp;statistics&nbsp;structure&nbsp;is&nbsp;used.&nbsp;\r\nstruct&nbsp;rtnl_link_stats64&nbsp;*dev_get_stats(struct&nbsp;net_device&nbsp;*dev,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;rtnl_link_stats64&nbsp;*storage)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;struct&nbsp;net_device_ops&nbsp;*ops&nbsp;=&nbsp;dev-&gt;netdev_ops;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ops-&gt;ndo_get_stats64)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(storage,&nbsp;0,&nbsp;sizeof(*storage));&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ops-&gt;ndo_get_stats64(dev,&nbsp;storage);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(ops-&gt;ndo_get_stats)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;netdev_stats_to_stats64(storage,&nbsp;ops-&gt;ndo_get_stats(dev));&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;netdev_stats_to_stats64(storage,&nbsp;&amp;dev-&gt;stats);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;storage-&gt;rx_dropped&nbsp;+=&nbsp;(unsigned&nbsp;long)atomic_long_read(&amp;dev-&gt;rx_dropped);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;storage-&gt;tx_dropped&nbsp;+=&nbsp;(unsigned&nbsp;long)atomic_long_read(&amp;dev-&gt;tx_dropped);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;storage-&gt;rx_nohandler&nbsp;+=&nbsp;(unsigned&nbsp;long)atomic_long_read(&amp;dev-&gt;rx_nohandler);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;storage;<\/pre>\n<\/p>\n<p>\u7ed3\u6784\u4f53 rtnl_link_stats64 \u7684\u5b9a\u4e49\u5728 \/usr\/iude\/linux\/if_link.h \u4e2d\uff1a<\/p>\n<\/p>\n<pre>\/*&nbsp;The&nbsp;main&nbsp;device&nbsp;statistics&nbsp;structure&nbsp;*\/&nbsp;\r\nstruct&nbsp;rtnl_link_stats64&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;rx_packets;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;total&nbsp;packets&nbsp;received&nbsp;&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;tx_packets;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;total&nbsp;packets&nbsp;transmitted&nbsp;&nbsp;&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;rx_bytes;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;total&nbsp;bytes&nbsp;received&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;tx_bytes;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;total&nbsp;bytes&nbsp;transmitted&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;rx_errors;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;bad&nbsp;packets&nbsp;received&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;tx_errors;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;packet&nbsp;transmit&nbsp;problems&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;rx_dropped;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;no&nbsp;space&nbsp;in&nbsp;linux&nbsp;buffers&nbsp;&nbsp;&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;tx_dropped;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;no&nbsp;space&nbsp;available&nbsp;in&nbsp;linux&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;multicast;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;multicast&nbsp;packets&nbsp;received&nbsp;&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;collisions;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;detailed&nbsp;rx_errors:&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;rx_length_errors;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;rx_over_errors;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;receiver&nbsp;ring&nbsp;buff&nbsp;overflow&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;rx_crc_errors;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;recved&nbsp;pkt&nbsp;with&nbsp;crc&nbsp;error&nbsp;&nbsp;&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;rx_frame_errors;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;recv'd&nbsp;frame&nbsp;alignment&nbsp;error&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;rx_fifo_errors;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;recv'r&nbsp;fifo&nbsp;overrun&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;rx_missed_errors;&nbsp;&nbsp;&nbsp;\/*&nbsp;receiver&nbsp;missed&nbsp;packet&nbsp;&nbsp;&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;detailed&nbsp;tx_errors&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;tx_aborted_errors;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;tx_carrier_errors;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;tx_fifo_errors;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;tx_heartbeat_errors;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;tx_window_errors;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;for&nbsp;cslip&nbsp;etc&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;rx_compressed;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__u64&nbsp;&nbsp;&nbsp;tx_compressed;&nbsp;\r\n};<\/pre>\n<\/p>\n<p>\u81f3\u6b64\uff0c\u6211\u4eec\u77e5\u9053 rx_dropped \u662f Linux \u4e2d\u7684\u7f13\u51b2\u533a\u7a7a\u95f4\u4e0d\u8db3\u5bfc\u81f4\u7684\u4e22\u5305\uff0c\u800c rx_missed_errors \u5219\u5728\u6ce8\u91ca\u4e2d\u5199\u7684\u6bd4\u8f83\u7b3c\u7edf\u3002<\/p>\n<p>\u6709\u8d44\u6599\u6307\u51fa\uff0crx_missed_errors \u662f fifo \u961f\u5217\uff08\u5373 rx ring buffer\uff09\u6ee1\u800c\u4e22\u5f03\u7684\u6570\u91cf\uff0c\u4f46\u8fd9\u6837\u7684\u8bdd\u4e5f\u5c31\u548c rx_fifo_errors \u7b49\u540c\u4e86\u3002<\/p>\n<p>\u540e\u6765\u516c\u53f8\u5185\u7f51\u7edc\u5185\u6838\u7814\u53d1\u5927\u725b\u738b\u4f1f\u7ed9\u4e86\u6211\u4eec\u70b9\u62e8\uff1a\u4e0d\u540c\u7f51\u5361\u81ea\u5df1\u5b9e\u73b0\u4e0d\u4e00\u6837\uff0c\u6bd4\u5982 Intel \u7684 igb \u7f51\u5361 rx_fifo_errors \u5728 missed \u7684\u57fa\u7840\u4e0a\uff0c\u8fd8\u52a0\u4e0a\u4e86 RQDPC \u8ba1\u6570\uff0c\u800c ixgbe \u5c31\u6ca1\u8fd9\u4e2a\u7edf\u8ba1\u3002<\/p>\n<p>RQDPC \u8ba1\u6570\u662f\u63cf\u8ff0\u7b26\u4e0d\u591f\u7684\u8ba1\u6570\uff0cmissed \u662f fifo \u6ee1\u7684\u8ba1\u6570\u3002\u6240\u4ee5\u5bf9\u4e8e ixgbe \u6765\u8bf4\uff0crx_fifo_errors \u548c rx_missed_errors \u786e\u5b9e\u662f\u7b49\u540c\u7684\u3002<\/p>\n<p>\u901a\u8fc7\u547d\u4ee4 ethtool -S eth0 \u53ef\u4ee5\u67e5\u770b\u7f51\u5361\u4e00\u4e9b\u7edf\u8ba1\u4fe1\u606f\uff0c\u5176\u4e2d\u5c31\u5305\u542b\u4e86\u4e0a\u6587\u63d0\u5230\u7684\u51e0\u4e2a\u91cd\u8981\u6307\u6807 rx_dropped\u3001rx_missed_errors\u3001rx_fifo_errors \u7b49\u3002<\/p>\n<p>\u4f46\u5b9e\u9645\u6d4b\u8bd5\u540e\uff0c\u6211\u53d1\u73b0\u4e0d\u540c\u7f51\u5361\u578b\u53f7\u7ed9\u51fa\u7684\u6307\u6807\u7565\u6709\u4e0d\u540c\uff0c\u6bd4\u5982 Intel ixgbe \u5c31\u80fd\u53d6\u5230\uff0c\u800c Broadcom bnx2\/tg3 \u5219\u53ea\u80fd\u53d6\u5230 rx_discards\uff08\u5bf9\u5e94rx_fifo_errors\uff09\u3001rx_fw_discards\uff08\u5bf9\u5e94 rx_dropped\uff09\u3002<\/p>\n<p>\u8fd9\u8868\u660e\uff0c\u5404\u5bb6\u7f51\u5361\u5382\u5546\u8bbe\u5907\u5185\u90e8\u5bf9\u8fd9\u4e9b\u4e22\u5305\u7684\u8ba1\u6570\u5668\u3001\u6307\u6807\u7684\u5b9a\u4e49\u7565\u6709\u4e0d\u540c\uff0c\u4f46\u901a\u8fc7\u9a71\u52a8\u5411\u5185\u6838\u63d0\u4f9b\u7684\u7edf\u8ba1\u6570\u636e\u90fd\u5c01\u88c5\u6210\u4e86 struct rtnl_link_stats64 \u5b9a\u4e49\u7684\u683c\u5f0f\u3002<\/p>\n<p>\u5728\u5bf9\u4e22\u5305\u670d\u52a1\u5668\u8fdb\u884c\u68c0\u67e5\u540e\uff0c\u53d1\u73b0 rx_missed_errors \u4e3a 0\uff0c\u4e22\u5305\u5168\u90e8\u6765\u81ea rx_dropped\uff0c\u8fd9\u8bf4\u660e\u4e22\u5305\u53d1\u751f\u5728 Linux \u5185\u6838\u7684\u7f13\u51b2\u533a\u4e2d\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u8981\u7ee7\u7eed\u63a2\u7d22\u5230\u5e95\u662f\u4ec0\u4e48\u7f13\u51b2\u533a\u5f15\u8d77\u4e86\u4e22\u5305\u95ee\u9898\uff0c\u8fd9\u5c31\u9700\u8981\u5b8c\u6574\u5730\u4e86\u89e3\u670d\u52a1\u5668\u63a5\u6536\u6570\u636e\u5305\u7684\u8fc7\u7a0b\u3002<\/p>\n<p><strong><span style=\"font-size: x-large\">\u4e86\u89e3\u63a5\u6536\u6570\u636e\u5305\u7684\u6d41\u7a0b<\/span><\/strong><\/p>\n<p>\u63a5\u6536\u6570\u636e\u5305\u662f\u4e00\u4e2a\u590d\u6742\u7684\u8fc7\u7a0b\uff0c\u6d89\u53ca\u5f88\u591a\u5e95\u5c42\u7684\u6280\u672f\u7ec6\u8282\uff0c\u4f46\u5927\u81f4\u9700\u8981\u4ee5\u4e0b\u51e0\u4e2a\u6b65\u9aa4\uff1a<\/p>\n<ul>\n<li>\n<p>\u7f51\u5361\u6536\u5230\u6570\u636e\u5305\u3002<\/p>\n<\/li>\n<li>\n<p>\u5c06\u6570\u636e\u5305\u4ece\u7f51\u5361\u786c\u4ef6\u7f13\u5b58\u8f6c\u79fb\u5230\u670d\u52a1\u5668\u5185\u5b58\u4e2d\u3002<\/p>\n<\/li>\n<li>\n<p>\u901a\u77e5\u5185\u6838\u5904\u7406\u3002<\/p>\n<\/li>\n<li>\n<p>\u7ecf\u8fc7 TCP\/IP \u534f\u8bae\u9010\u5c42\u5904\u7406\u3002<\/p>\n<\/li>\n<li>\n<p>\u5e94\u7528\u7a0b\u5e8f\u901a\u8fc7 read() \u4ece socket buffer \u8bfb\u53d6\u6570\u636e\u3002<\/p>\n<\/li>\n<\/ul>\n<\/p>\n<p><strong><span style=\"font-size: large\">\u5c06\u7f51\u5361\u6536\u5230\u7684\u6570\u636e\u5305\u8f6c\u79fb\u5230\u4e3b\u673a\u5185\u5b58<\/span><\/strong><\/p>\n<p>NIC\u4e0e\u9a71\u52a8\u4ea4\u4e92\uff1aNIC \u5728\u63a5\u6536\u5230\u6570\u636e\u5305\u4e4b\u540e\uff0c\u9996\u5148\u9700\u8981\u5c06\u6570\u636e\u540c\u6b65\u5230\u5185\u6838\u4e2d\uff0c\u8fd9\u4e2d\u95f4\u7684\u6865\u6881\u662f rx ring buffer\u3002\u5b83\u662f\u7531 NIC \u548c\u9a71\u52a8\u7a0b\u5e8f\u5171\u4eab\u7684\u4e00\u7247\u533a\u57df\u3002<\/p>\n<p>\u4e8b\u5b9e\u4e0a\uff0crx ring buffer \u5b58\u50a8\u7684\u5e76\u4e0d\u662f\u5b9e\u9645\u7684 packet \u6570\u636e\uff0c\u800c\u662f\u4e00\u4e2a\u63cf\u8ff0\u7b26\u3002<\/p>\n<p>\u8fd9\u4e2a\u63cf\u8ff0\u7b26\u6307\u5411\u4e86\u5b83\u771f\u6b63\u7684\u5b58\u50a8\u5730\u5740\uff0c\u5177\u4f53\u6d41\u7a0b\u5982\u4e0b\uff1a<\/p>\n<ul>\n<li>\n<p>\u9a71\u52a8\u5728\u5185\u5b58\u4e2d\u5206\u914d\u4e00\u7247\u7f13\u51b2\u533a\u7528\u6765\u63a5\u6536\u6570\u636e\u5305\uff0c\u53eb\u505a sk_buffer\u3002<\/p>\n<\/li>\n<li>\n<p>\u5c06\u4e0a\u8ff0\u7f13\u51b2\u533a\u7684\u5730\u5740\u548c\u5927\u5c0f\uff08\u5373\u63a5\u6536\u63cf\u8ff0\u7b26\uff09\uff0c\u52a0\u5165\u5230 rx ring buffer\u3002\u63cf\u8ff0\u7b26\u4e2d\u7684\u7f13\u51b2\u533a\u5730\u5740\u662f DMA \u4f7f\u7528\u7684\u7269\u7406\u5730\u5740\u3002<\/p>\n<\/li>\n<li>\n<p>\u9a71\u52a8\u901a\u77e5\u7f51\u5361\u6709\u4e00\u4e2a\u65b0\u7684\u63cf\u8ff0\u7b26\u3002<\/p>\n<\/li>\n<li>\n<p>\u7f51\u5361\u4ece rx ring buffer \u4e2d\u53d6\u51fa\u63cf\u8ff0\u7b26\uff0c\u4ece\u800c\u83b7\u77e5\u7f13\u51b2\u533a\u7684\u5730\u5740\u548c\u5927\u5c0f\u3002<\/p>\n<\/li>\n<li>\n<p>\u7f51\u5361\u6536\u5230\u65b0\u7684\u6570\u636e\u5305\u3002<\/p>\n<\/li>\n<li>\n<p>\u7f51\u5361\u5c06\u65b0\u6570\u636e\u5305\u901a\u8fc7 DMA \u76f4\u63a5\u5199\u5230 sk_buffer \u4e2d\u3002<\/p>\n<\/li>\n<\/ul>\n<\/p>\n<p>\u5f53\u9a71\u52a8\u5904\u7406\u901f\u5ea6\u8ddf\u4e0d\u4e0a\u7f51\u5361\u6536\u5305\u901f\u5ea6\u65f6\uff0c\u9a71\u52a8\u6765\u4e0d\u53ca\u5206\u914d\u7f13\u51b2\u533a\uff0cNIC \u63a5\u6536\u5230\u7684\u6570\u636e\u5305\u65e0\u6cd5\u53ca\u65f6\u5199\u5230 sk_buffer\uff0c\u5c31\u4f1a\u4ea7\u751f\u5806\u79ef\uff0c\u5f53 NIC \u5185\u90e8\u7f13\u51b2\u533a\u5199\u6ee1\u540e\uff0c\u5c31\u4f1a\u4e22\u5f03\u90e8\u5206\u6570\u636e\uff0c\u5f15\u8d77\u4e22\u5305\u3002<\/p>\n<p>\u8fd9\u90e8\u5206\u4e22\u5305\u4e3a rx_fifo_errors\uff0c\u5728 \/proc\/net\/dev \u4e2d\u4f53\u73b0\u4e3a fifo \u5b57\u6bb5\u589e\u957f\uff0c\u5728 ifconfig \u4e2d\u4f53\u73b0\u4e3a overruns \u6307\u6807\u589e\u957f\u3002<\/p>\n<p><strong><span style=\"font-size: large\">\u901a\u77e5\u7cfb\u7edf\u5185\u6838\u5904\u7406<\/span><\/strong><\/p>\n<p>\u9a71\u52a8\u4e0e Linux \u5185\u6838\u4ea4\u4e92\uff1a\u8fd9\u4e2a\u65f6\u5019\uff0c\u6570\u636e\u5305\u5df2\u7ecf\u88ab\u8f6c\u79fb\u5230\u4e86 sk_buffer \u4e2d\u3002<\/p>\n<p>\u524d\u6587\u63d0\u5230\uff0c\u8fd9\u662f\u9a71\u52a8\u7a0b\u5e8f\u5728\u5185\u5b58\u4e2d\u5206\u914d\u7684\u4e00\u7247\u7f13\u51b2\u533a\uff0c\u5e76\u4e14\u662f\u901a\u8fc7 DMA \u5199\u5165\u7684\uff0c\u8fd9\u79cd\u65b9\u5f0f\u4e0d\u4f9d\u8d56 CPU \u76f4\u63a5\u5c06\u6570\u636e\u5199\u5230\u4e86\u5185\u5b58\u4e2d\uff0c\u610f\u5473\u7740\u5bf9\u5185\u6838\u6765\u8bf4\uff0c\u5176\u5b9e\u5e76\u4e0d\u77e5\u9053\u5df2\u7ecf\u6709\u65b0\u6570\u636e\u5230\u4e86\u5185\u5b58\u4e2d\u3002<\/p>\n<p>\u90a3\u4e48\u5982\u4f55\u8ba9\u5185\u6838\u77e5\u9053\u6709\u65b0\u6570\u636e\u8fdb\u6765\u4e86\u5462\uff1f\u7b54\u6848\u5c31\u662f\u4e2d\u65ad\uff0c\u901a\u8fc7\u4e2d\u65ad\u544a\u8bc9\u5185\u6838\u6709\u65b0\u6570\u636e\u8fdb\u6765\u4e86\uff0c\u5e76\u9700\u8981\u8fdb\u884c\u540e\u7eed\u5904\u7406\u3002<\/p>\n<p>\u63d0\u5230\u4e2d\u65ad\uff0c\u5c31\u6d89\u53ca\u5230\u786c\u4e2d\u65ad\u548c\u8f6f\u4e2d\u65ad\uff0c\u9996\u5148\u9700\u8981\u7b80\u5355\u4e86\u89e3\u4e00\u4e0b\u5b83\u4eec\u7684\u533a\u522b\uff1a<\/p>\n<ul>\n<li>\n<p>\u786c\u4e2d\u65ad\uff1a \u7531\u786c\u4ef6\u81ea\u5df1\u751f\u6210\uff0c\u5177\u6709\u968f\u673a\u6027\uff0c\u786c\u4e2d\u65ad\u88ab CPU \u63a5\u6536\u540e\uff0c\u89e6\u53d1\u6267\u884c\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f\u3002<\/p>\n<\/li>\n<\/ul>\n<p>\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f\u53ea\u4f1a\u5904\u7406\u5173\u952e\u6027\u7684\u3001\u77ed\u65f6\u95f4\u5185\u53ef\u4ee5\u5904\u7406\u5b8c\u7684\u5de5\u4f5c\uff0c\u5269\u4f59\u8017\u65f6\u8f83\u957f\u5de5\u4f5c\uff0c\u4f1a\u653e\u5230\u4e2d\u65ad\u4e4b\u540e\uff0c\u7531\u8f6f\u4e2d\u65ad\u6765\u5b8c\u6210\u3002\u786c\u4e2d\u65ad\u4e5f\u88ab\u79f0\u4e3a\u4e0a\u534a\u90e8\u5206\u3002<\/p>\n<ul>\n<li>\n<p>\u8f6f\u4e2d\u65ad\uff1a \u7531\u786c\u4e2d\u65ad\u5bf9\u5e94\u7684\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f\u751f\u6210\uff0c\u5f80\u5f80\u662f\u9884\u5148\u5728\u4ee3\u7801\u91cc\u5b9e\u73b0\u597d\u7684\uff0c\u4e0d\u5177\u6709\u968f\u673a\u6027\u3002\uff08\u9664\u6b64\u4e4b\u5916\uff0c\u4e5f\u6709\u5e94\u7528\u7a0b\u5e8f\u89e6\u53d1\u7684\u8f6f\u4e2d\u65ad\uff0c\u4e0e\u672c\u6587\u8ba8\u8bba\u7684\u7f51\u5361\u6536\u5305\u65e0\u5173\u3002\uff09\u4e5f\u88ab\u79f0\u4e3a\u4e0b\u534a\u90e8\u5206\u3002<\/p>\n<\/li>\n<\/ul>\n<p>\u5f53 NIC \u628a\u6570\u636e\u5305\u901a\u8fc7 DMA \u590d\u5236\u5230\u5185\u6838\u7f13\u51b2\u533a sk_buffer \u540e\uff0cNIC \u7acb\u5373\u53d1\u8d77\u4e00\u4e2a\u786c\u4ef6\u4e2d\u65ad\u3002<\/p>\n<p>CPU \u63a5\u6536\u540e\uff0c\u9996\u5148\u8fdb\u5165\u4e0a\u534a\u90e8\u5206\uff0c\u7f51\u5361\u4e2d\u65ad\u5bf9\u5e94\u7684\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f\u662f\u7f51\u5361\u9a71\u52a8\u7a0b\u5e8f\u7684\u4e00\u90e8\u5206\uff0c\u4e4b\u540e\u7531\u5b83\u53d1\u8d77\u8f6f\u4e2d\u65ad\uff0c\u8fdb\u5165\u4e0b\u534a\u90e8\u5206\uff0c\u5f00\u59cb\u6d88\u8d39 sk_buffer \u4e2d\u7684\u6570\u636e\uff0c\u4ea4\u7ed9\u5185\u6838\u534f\u8bae\u6808\u5904\u7406\u3002<\/p>\n<\/p>\n<p>\u901a\u8fc7\u4e2d\u65ad\uff0c\u80fd\u591f\u5feb\u901f\u53ca\u65f6\u5730\u54cd\u5e94\u7f51\u5361\u6570\u636e\u8bf7\u6c42\uff0c\u4f46\u5982\u679c\u6570\u636e\u91cf\u5927\uff0c\u90a3\u4e48\u4f1a\u4ea7\u751f\u5927\u91cf\u4e2d\u65ad\u8bf7\u6c42\uff0cCPU \u5927\u90e8\u5206\u65f6\u95f4\u90fd\u5fd9\u4e8e\u5904\u7406\u4e2d\u65ad\uff0c\u6548\u7387\u5f88\u4f4e\u3002<\/p>\n<p>\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u73b0\u5728\u7684\u5185\u6838\u53ca\u9a71\u52a8\u90fd\u91c7\u7528\u4e00\u79cd\u53eb NAPI\uff08new API\uff09\u7684\u65b9\u5f0f\u8fdb\u884c\u6570\u636e\u5904\u7406\uff0c\u5176\u539f\u7406\u53ef\u4ee5\u7b80\u5355\u7406\u89e3\u4e3a\u4e2d\u65ad+\u8f6e\u8be2\uff0c\u5728\u6570\u636e\u91cf\u5927\u65f6\uff0c\u4e00\u6b21\u4e2d\u65ad\u540e\u901a\u8fc7\u8f6e\u8be2\u63a5\u6536\u4e00\u5b9a\u6570\u91cf\u5305\u518d\u8fd4\u56de\uff0c\u907f\u514d\u4ea7\u751f\u591a\u6b21\u4e2d\u65ad\u3002<\/p>\n<p>\u6574\u4e2a\u4e2d\u65ad\u8fc7\u7a0b\u7684\u6e90\u7801\u90e8\u5206\u6bd4\u8f83\u590d\u6742\uff0c\u5e76\u4e14\u4e0d\u540c\u9a71\u52a8\u7684\u5382\u5546\u53ca\u7248\u672c\u4e5f\u4f1a\u5b58\u5728\u4e00\u5b9a\u7684\u533a\u522b\u3002&nbsp;<\/p>\n<p>\u4ee5\u4e0b\u8c03\u7528\u5173\u7cfb\u57fa\u4e8e Linux-3.10.108 \u53ca\u5185\u6838\u81ea\u5e26\u9a71\u52a8 drivers\/net\/ethernet\/intel\/ixgbe\uff1a<\/p>\n<\/p>\n<p>\u6ce8\u610f\u5230\uff0cenqueue_to_backlog \u51fd\u6570\u4e2d\uff0c\u4f1a\u5bf9 CPU \u7684 softnet_data \u5b9e\u4f8b\u4e2d\u7684\u63a5\u6536\u961f\u5217\uff08input_pkt_queue\uff09\u8fdb\u884c\u5224\u65ad\u3002<\/p>\n<p>\u5982\u679c\u961f\u5217\u4e2d\u7684\u6570\u636e\u957f\u5ea6\u8d85\u8fc7 netdev_max_backlog \uff0c\u90a3\u4e48\u6570\u636e\u5305\u5c06\u76f4\u63a5\u4e22\u5f03\uff0c\u8fd9\u5c31\u4ea7\u751f\u4e86\u4e22\u5305\u3002<\/p>\n<p>netdev_max_backlog \u662f\u7531\u7cfb\u7edf\u53c2\u6570 net.core.netdev_max_backlog \u6307\u5b9a\u7684\uff0c\u9ed8\u8ba4\u5927\u5c0f\u662f 1000\u3002<\/p>\n<\/p>\n<pre>&nbsp;*&nbsp;enqueue_to_backlog&nbsp;is&nbsp;called&nbsp;to&nbsp;queue&nbsp;an&nbsp;skb&nbsp;to&nbsp;a&nbsp;per&nbsp;CPU&nbsp;backlog&nbsp;\r\n&nbsp;*&nbsp;queue&nbsp;(may&nbsp;be&nbsp;a&nbsp;remote&nbsp;CPU&nbsp;queue).&nbsp;\r\nstatic&nbsp;int&nbsp;enqueue_to_backlog(struct&nbsp;sk_buff&nbsp;*skb,&nbsp;int&nbsp;cpu,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;*qtail)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;softnet_data&nbsp;*sd;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;flags;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;sd&nbsp;=&nbsp;&amp;per_cpu(softnet_data,&nbsp;cpu);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;local_irq_save(flags);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;rps_lock(sd);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\u5224\u65ad\u63a5\u6536\u961f\u5217\u662f\u5426\u6ee1\uff0c\u961f\u5217\u957f\u5ea6\u4e3a&nbsp;netdev_max_backlog&nbsp;&nbsp;*\/&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(skb_queue_len(&amp;sd-&gt;input_pkt_queue)&nbsp;input_pkt_queue))&nbsp;{&nbsp;\r\nenqueue:&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__skb_queue_tail(&amp;sd-&gt;input_pkt_queue,&nbsp;skb);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input_queue_tail_incr_save(sd,&nbsp;qtail);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rps_unlock(sd);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local_irq_restore(flags);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NET_RX_SUCCESS;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Schedule&nbsp;NAPI&nbsp;for&nbsp;backlog&nbsp;device&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;We&nbsp;can&nbsp;use&nbsp;non&nbsp;atomic&nbsp;operation&nbsp;since&nbsp;we&nbsp;own&nbsp;the&nbsp;queue&nbsp;lock&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;&nbsp;\u961f\u5217\u5982\u679c\u4e3a\u7a7a\uff0c\u56de\u5230&nbsp;____napi_schedule\u52a0\u5165poll_list\u8f6e\u8be2\u90e8\u5206\uff0c\u5e76\u91cd\u65b0\u53d1\u8d77\u8f6f\u4e2d\u65ad&nbsp;&nbsp;*\/&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!__test_and_set_bit(NAPI_STATE_SCHED,&nbsp;&amp;sd-&gt;backlog.state))&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!rps_ipi_queued(sd))&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;____napi_schedule(sd,&nbsp;&amp;sd-&gt;backlog);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;enqueue;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\u961f\u5217\u6ee1\u5219\u76f4\u63a5\u4e22\u5f03\uff0c\u5bf9\u5e94\u8ba1\u6570\u5668&nbsp;+1&nbsp;*\/&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;sd-&gt;dropped++;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;rps_unlock(sd);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;local_irq_restore(flags);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;atomic_long_inc(&amp;skb-&gt;dev-&gt;rx_dropped);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;kfree_skb(skb);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NET_RX_DROP;<\/pre>\n<\/p>\n<p>\u5185\u6838\u4f1a\u4e3a\u6bcf\u4e2a CPU Core \u90fd\u5b9e\u4f8b\u5316\u4e00\u4e2a softnet_data \u5bf9\u8c61\uff0c\u8fd9\u4e2a\u5bf9\u8c61\u4e2d\u7684 input_pkt_queue \u7528\u4e8e\u7ba1\u7406\u63a5\u6536\u7684\u6570\u636e\u5305\u3002<\/p>\n<p>\u5047\u5982\u6240\u6709\u7684\u4e2d\u65ad\u90fd\u7531\u4e00\u4e2a CPU Core \u6765\u5904\u7406\u7684\u8bdd\uff0c\u90a3\u4e48\u6240\u6709\u6570\u636e\u5305\u53ea\u80fd\u7ecf\u7531\u8fd9\u4e2a CPU \u7684 input_pkt_queue\u3002<\/p>\n<p>\u5982\u679c\u63a5\u6536\u7684\u6570\u636e\u5305\u6570\u91cf\u975e\u5e38\u5927\uff0c\u8d85\u8fc7\u4e2d\u65ad\u5904\u7406\u901f\u5ea6\uff0c\u90a3\u4e48 input_pkt_queue \u4e2d\u7684\u6570\u636e\u5305\u5c31\u4f1a\u5806\u79ef\uff0c\u76f4\u81f3\u8d85\u8fc7 netdev_max_backlog\uff0c\u5f15\u8d77\u4e22\u5305\u3002<\/p>\n<p>\u8fd9\u90e8\u5206\u4e22\u5305\u53ef\u4ee5\u5728 cat \/proc\/net\/softnet_stat \u7684\u8f93\u51fa\u7ed3\u679c\u4e2d\u8fdb\u884c\u786e\u8ba4\uff1a<\/p>\n<\/p>\n<p>\u5176\u4e2d\u6bcf\u884c\u4ee3\u8868\u4e00\u4e2a CPU\uff0c\u7b2c\u4e00\u5217\u662f\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f\u63a5\u6536\u7684\u5e27\u6570\uff0c\u7b2c\u4e8c\u5217\u662f\u7531\u4e8e\u8d85\u8fc7 netdev_max_backlog \u800c\u4e22\u5f03\u7684\u5e27\u6570\u3002&nbsp;<\/p>\n<p>\u7b2c\u4e09\u5217\u5219\u662f\u5728 net_rx_action \u51fd\u6570\u4e2d\u5904\u7406\u6570\u636e\u5305\u8d85\u8fc7 netdev_budget \u6307\u5b9a\u6570\u91cf\u6216\u8fd0\u884c\u65f6\u95f4\u8d85\u8fc7 2 \u4e2a\u65f6\u95f4\u7247\u7684\u6b21\u6570\u3002<\/p>\n<p>\u5728\u68c0\u67e5\u7ebf\u4e0a\u670d\u52a1\u5668\u4e4b\u540e\uff0c\u53d1\u73b0\u7b2c\u4e00\u884c CPU\u3002\u786c\u4e2d\u65ad\u7684\u4e2d\u65ad\u53f7\u53ca\u7edf\u8ba1\u6570\u636e\u53ef\u4ee5\u5728 \/proc\/interrupts \u4e2d\u770b\u5230\u3002<\/p>\n<p>\u5bf9\u4e8e\u591a\u961f\u5217\u7f51\u5361\uff0c\u5f53\u7cfb\u7edf\u542f\u52a8\u5e76\u52a0\u8f7d NIC \u8bbe\u5907\u9a71\u52a8\u7a0b\u5e8f\u6a21\u5757\u65f6\uff0c\u6bcf\u4e2a RXTX \u961f\u5217\u4f1a\u88ab\u521d\u59cb\u5316\u5206\u914d\u4e00\u4e2a\u552f\u4e00\u7684\u4e2d\u65ad\u5411\u91cf\u53f7\uff0c\u5b83\u901a\u77e5\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f\u8be5\u4e2d\u65ad\u6765\u81ea\u54ea\u4e2a NIC \u961f\u5217\u3002<\/p>\n<p>\u5728\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u961f\u5217\u7684\u786c\u4e2d\u65ad\u90fd\u7531 CPU 0 \u5904\u7406\uff0c\u56e0\u6b64\u5bf9\u5e94\u7684\u8f6f\u4e2d\u65ad\u903b\u8f91\u4e5f\u4f1a\u5728 CPU 0 \u4e0a\u5904\u7406\uff0c\u5728\u670d\u52a1\u5668 TOP \u7684\u8f93\u51fa\u4e2d\uff0c\u4e5f\u53ef\u4ee5\u89c2\u5bdf\u5230 %si \u8f6f\u4e2d\u65ad\u90e8\u5206\uff0cCPU 0 \u7684\u5360\u6bd4\u6bd4\u5176\u4ed6 Core \u9ad8\u51fa\u4e00\u622a\u3002<\/p>\n<p>\u5230\u8fd9\u91cc\u5176\u5b9e\u6709\u5b58\u5728\u4e00\u4e2a\u7591\u60d1\uff0c\u6211\u4eec\u7ebf\u4e0a\u670d\u52a1\u5668\u7684\u5185\u6838\u7248\u672c\u53ca\u7f51\u5361\u90fd\u652f\u6301 NAPI\u3002<\/p>\n<p>\u800c NAPI \u7684\u5904\u7406\u903b\u8f91\u662f\u4e0d\u4f1a\u8d70\u5230 enqueue_to_backlog \u4e2d\u7684\uff0cenqueue_to_backlog \u4e3b\u8981\u662f\u975e NAPI \u7684\u5904\u7406\u6d41\u7a0b\u4e2d\u4f7f\u7528\u7684\u3002<\/p>\n<p>\u5bf9\u6b64\uff0c\u6211\u4eec\u89c9\u5f97\u53ef\u80fd\u548c\u5f53\u524d\u4f7f\u7528\u7684 Docker \u67b6\u6784\u6709\u5173\uff0c\u4e8b\u5b9e\u4e0a\uff0c\u6211\u4eec\u901a\u8fc7 net.if.dropped \u6307\u6807\u83b7\u53d6\u5230\u7684\u4e22\u5305\uff0c\u90fd\u53d1\u751f\u5728 Docker \u865a\u62df\u7f51\u5361\u4e0a\uff0c\u800c\u975e\u5bbf\u4e3b\u673a\u7269\u7406\u7f51\u5361\u4e0a\u3002<\/p>\n<p>\u56e0\u6b64\u5f88\u53ef\u80fd\u662f Docker \u865a\u62df\u7f51\u6865\u8f6c\u53d1\u6570\u636e\u5305\u4e4b\u540e\uff0c\u865a\u62df\u7f51\u5361\u5c42\u9762\u4ea7\u751f\u7684\u4e22\u5305\uff0c\u8fd9\u91cc\u7531\u4e8e\u6d89\u53ca\u865a\u62df\u5316\u90e8\u5206\uff0c\u5c31\u4e0d\u8fdb\u4e00\u6b65\u5206\u6790\u4e86\u3002<\/p>\n<p>\u9a71\u52a8\u53ca\u5185\u6838\u5904\u7406\u8fc7\u7a0b\u4e2d\u7684\u51e0\u4e2a\u91cd\u8981\u51fd\u6570\uff1a<\/p>\n<p><strong>(1) \u6ce8\u518c\u4e2d\u65ad\u53f7\u53ca\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f\uff0c\u6839\u636e\u7f51\u5361\u662f\u5426\u652f\u6301 MSI\/MSIX\uff0c\u7ed3\u679c\u4e3a\uff1aMSIX \u2192 ixgbe_msix_clean_rings\uff0cMSI \u2192 ixgbe_intr\uff0c\u90fd\u4e0d\u652f\u6301 \u2192 ixgbe_intr\u3002<\/strong><\/p>\n<\/p>\n<pre>&nbsp;*&nbsp;\u6587\u4ef6\uff1aixgbe_main.c&nbsp;\r\n&nbsp;*&nbsp;ixgbe_request_irq&nbsp;-&nbsp;initialize&nbsp;interrupts&nbsp;\r\n&nbsp;*&nbsp;@adapter:&nbsp;board&nbsp;private&nbsp;structure&nbsp;\r\n&nbsp;*&nbsp;Attempts&nbsp;to&nbsp;configure&nbsp;interrupts&nbsp;using&nbsp;the&nbsp;best&nbsp;available&nbsp;\r\n&nbsp;*&nbsp;capabilities&nbsp;of&nbsp;the&nbsp;hardware&nbsp;and&nbsp;kernel.&nbsp;\r\nstatic&nbsp;int&nbsp;ixgbe_request_irq(struct&nbsp;ixgbe_adapter&nbsp;*adapter)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;net_device&nbsp;*netdev&nbsp;=&nbsp;adapter-&gt;netdev;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;err;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\u652f\u6301MSIX\uff0c\u8c03\u7528&nbsp;ixgbe_request_msix_irqs&nbsp;\u8bbe\u7f6e\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(adapter-&gt;flags&nbsp;&amp;&nbsp;IXGBE_FLAG_MSIX_ENABLED)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;=&nbsp;ixgbe_request_msix_irqs(adapter);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\u652f\u6301MSI\uff0c\u76f4\u63a5\u8bbe\u7f6e&nbsp;ixgbe_intr&nbsp;\u4e3a\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(adapter-&gt;flags&nbsp;&amp;&nbsp;IXGBE_FLAG_MSI_ENABLED)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;=&nbsp;request_irq(adapter-&gt;pdev-&gt;irq,&nbsp;&amp;ixgbe_intr,&nbsp;0,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;netdev-&gt;name,&nbsp;adapter);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\u90fd\u4e0d\u652f\u6301\u7684\u60c5\u51b5\uff0c\u76f4\u63a5\u8bbe\u7f6e&nbsp;ixgbe_intr&nbsp;\u4e3a\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;=&nbsp;request_irq(adapter-&gt;pdev-&gt;irq,&nbsp;&amp;ixgbe_intr,&nbsp;IRQF_SHARED,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;netdev-&gt;name,&nbsp;adapter);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(err)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e_err(probe,&nbsp;\"request_irq&nbsp;failed,&nbsp;Error&nbsp;%dn\",&nbsp;err);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;err;&nbsp;\r\n&nbsp;*&nbsp;\u6587\u4ef6\uff1aixgbe_main.c&nbsp;\r\n&nbsp;*&nbsp;ixgbe_request_msix_irqs&nbsp;-&nbsp;Initialize&nbsp;MSI-X&nbsp;interrupts&nbsp;\r\n&nbsp;*&nbsp;@adapter:&nbsp;board&nbsp;private&nbsp;structure&nbsp;\r\n&nbsp;*&nbsp;ixgbe_request_msix_irqs&nbsp;allocates&nbsp;MSI-X&nbsp;vectors&nbsp;and&nbsp;requests&nbsp;\r\n&nbsp;*&nbsp;interrupts&nbsp;from&nbsp;the&nbsp;kernel.&nbsp;\r\nstatic&nbsp;int&nbsp;(struct&nbsp;ixgbe_adapter&nbsp;*adapter)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2026&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(vector&nbsp;=&nbsp;0;&nbsp;vector&nbsp;num_q_vectors;&nbsp;vector++)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;ixgbe_q_vector&nbsp;*q_vector&nbsp;=&nbsp;adapter-&gt;q_vector[vector];&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;msix_entry&nbsp;*entry&nbsp;=&nbsp;&amp;adapter-&gt;msix_entries[vector];&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\u8bbe\u7f6e\u4e2d\u65ad\u5904\u7406\u5165\u53e3\u51fd\u6570\u4e3a&nbsp;ixgbe_msix_clean_rings&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;=&nbsp;request_irq(entry-&gt;vector,&nbsp;&amp;ixgbe_msix_clean_rings,&nbsp;0,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q_vector-&gt;name,&nbsp;q_vector);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(err)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e_err(probe,&nbsp;\"request_irq&nbsp;failed&nbsp;for&nbsp;MSIX&nbsp;interrupt&nbsp;'%s'&nbsp;\"&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"Error:&nbsp;%dn\",&nbsp;q_vector-&gt;name,&nbsp;err);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;free_queue_irqs;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2026<\/pre>\n<\/p>\n<p><strong>(2) \u7ebf\u4e0a\u7684\u591a\u961f\u5217\u7f51\u5361\u5747\u652f\u6301 MSIX\uff0c\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f\u5165\u53e3\u4e3a\uff1aixgbe_msix_clean_rings\uff0c\u91cc\u9762\u8c03\u7528\u4e86\u51fd\u6570 napi_schedule(&amp;q_vector-&gt;napi)\u3002<\/strong><\/p>\n<\/p>\n<pre>&nbsp;*&nbsp;\u6587\u4ef6\uff1aixgbe_main.c&nbsp;\r\nstatic&nbsp;irqreturn_t&nbsp;ixgbe_msix_clean_rings(int&nbsp;irq,&nbsp;void&nbsp;*data)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;ixgbe_q_vector&nbsp;*q_vector&nbsp;=&nbsp;data;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;EIAM&nbsp;disabled&nbsp;interrupts&nbsp;(on&nbsp;this&nbsp;vector)&nbsp;for&nbsp;us&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(q_vector-&gt;rx.ring&nbsp;||&nbsp;q_vector-&gt;tx.ring)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;napi_schedule(&amp;q_vector-&gt;napi);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;IRQ_HANDLED;<\/pre>\n<\/p>\n<p><strong>(3) \u4e4b\u540e\u7ecf\u8fc7\u4e00\u4e9b\u5217\u8c03\u7528\uff0c\u76f4\u5230\u53d1\u8d77\u540d\u4e3a NET_RX_SOFTIRQ \u7684\u8f6f\u4e2d\u65ad\u3002\u5230\u8fd9\u91cc\u5b8c\u6210\u4e86\u786c\u4e2d\u65ad\u90e8\u5206\uff0c\u8fdb\u5165\u8f6f\u4e2d\u65ad\u90e8\u5206\uff0c\u540c\u65f6\u4e5f\u4e0a\u5347\u5230\u4e86\u5185\u6838\u5c42\u9762\u3002<\/strong><\/p>\n<\/p>\n<pre>&nbsp;*&nbsp;\u6587\u4ef6\uff1ainclude\/linux\/netdevice.h&nbsp;\r\n&nbsp;*&nbsp;&nbsp;napi_schedule&nbsp;-&nbsp;schedule&nbsp;NAPI&nbsp;poll&nbsp;\r\n&nbsp;*&nbsp;&nbsp;@n:&nbsp;NAPI&nbsp;context&nbsp;\r\n&nbsp;*&nbsp;Schedule&nbsp;NAPI&nbsp;poll&nbsp;routine&nbsp;to&nbsp;be&nbsp;called&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;\r\n&nbsp;*&nbsp;running.&nbsp;\r\nstatic&nbsp;inline&nbsp;void&nbsp;napi_schedule(struct&nbsp;napi_struct&nbsp;*n)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(napi_schedule_prep(n))&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__napi_schedule(n);&nbsp;\r\n&nbsp;*&nbsp;\u6587\u4ef6\uff1anet\/core\/dev.c&nbsp;\r\n&nbsp;*&nbsp;__napi_schedule&nbsp;-&nbsp;schedule&nbsp;for&nbsp;receive&nbsp;\r\n&nbsp;*&nbsp;@n:&nbsp;entry&nbsp;to&nbsp;schedule&nbsp;\r\n&nbsp;*&nbsp;The&nbsp;entry's&nbsp;receive&nbsp;function&nbsp;will&nbsp;be&nbsp;scheduled&nbsp;to&nbsp;run.&nbsp;\r\n&nbsp;*&nbsp;Consider&nbsp;using&nbsp;__napi_schedule_irqoff()&nbsp;if&nbsp;hard&nbsp;irqs&nbsp;are&nbsp;masked.&nbsp;\r\nvoid&nbsp;__napi_schedule(struct&nbsp;napi_struct&nbsp;*n)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;flags;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;&nbsp;local_irq_save\u7528\u6765\u4fdd\u5b58\u4e2d\u65ad\u72b6\u6001\uff0c\u5e76\u7981\u6b62\u4e2d\u65ad&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;local_irq_save(flags);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;&nbsp;\u6ce8\u610f\u4e0b\u9762\u8c03\u7528\u7684\u8fd9\u4e2a\u51fd\u6570\u540d\u5b57\u524d\u662f\u56db\u4e2a\u4e0b\u5212\u7ebf\uff0c\u4f20\u5165\u7684&nbsp;softnet_data&nbsp;\u662f\u5f53\u524dCPU&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;____napi_schedule(this_cpu_ptr(&amp;softnet_data),&nbsp;n);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;local_irq_restore(flags);&nbsp;\r\n\/*&nbsp;Called&nbsp;with&nbsp;irq&nbsp;disabled&nbsp;*\/&nbsp;\r\nstatic&nbsp;inline&nbsp;void&nbsp;____napi_schedule(struct&nbsp;softnet_data&nbsp;*sd,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;napi_struct&nbsp;*napi)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\u5c06&nbsp;napi_struct&nbsp;\u52a0\u5165&nbsp;softnet_data&nbsp;\u7684&nbsp;poll_list&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;list_add_tail(&amp;napi-&gt;poll_list,&nbsp;&amp;sd-&gt;poll_list);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\u53d1\u8d77\u8f6f\u4e2d\u65ad&nbsp;NET_RX_SOFTIRQ&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;__raise_softirq_irqoff(NET_RX_SOFTIRQ);<\/pre>\n<\/p>\n<p><strong>(4) NET_RX_SOFTIRQ \u5bf9\u5e94\u7684\u8f6f\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f\u63a5\u53e3\u662f net_rx_action()\u3002<\/strong><\/p>\n<\/p>\n<pre>&nbsp;*&nbsp;&nbsp;\u6587\u4ef6\uff1anet\/core\/dev.c&nbsp;\r\n&nbsp;*&nbsp;&nbsp;Initialize&nbsp;the&nbsp;DEV&nbsp;module.&nbsp;At&nbsp;boot&nbsp;time&nbsp;this&nbsp;walks&nbsp;the&nbsp;device&nbsp;list&nbsp;and&nbsp;\r\n&nbsp;*&nbsp;&nbsp;unhooks&nbsp;any&nbsp;devices&nbsp;that&nbsp;fail&nbsp;to&nbsp;initialise&nbsp;(normally&nbsp;hardware&nbsp;not&nbsp;\r\n&nbsp;*&nbsp;&nbsp;present)&nbsp;and&nbsp;leaves&nbsp;us&nbsp;with&nbsp;a&nbsp;valid&nbsp;list&nbsp;of&nbsp;present&nbsp;and&nbsp;active&nbsp;devices.&nbsp;\r\n&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;is&nbsp;called&nbsp;single&nbsp;threaded&nbsp;during&nbsp;boot,&nbsp;so&nbsp;no&nbsp;need&nbsp;\r\n&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;take&nbsp;the&nbsp;rtnl&nbsp;semaphore.&nbsp;\r\nstatic&nbsp;int&nbsp;__init&nbsp;net_dev_init(void)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2026&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;&nbsp;\u5206\u522b\u6ce8\u518cTX\u548cRX\u8f6f\u4e2d\u65ad\u7684\u5904\u7406\u7a0b\u5e8f&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;open_softirq(NET_TX_SOFTIRQ,&nbsp;net_tx_action);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;open_softirq(NET_RX_SOFTIRQ,&nbsp;net_rx_action);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2026<\/pre>\n<\/p>\n<p><strong>(5) net_rx_action \u529f\u80fd\u5c31\u662f\u8f6e\u8be2\u8c03\u7528 poll \u65b9\u6cd5\uff0c\u8fd9\u91cc\u5c31\u662f ixgbe_poll\u3002<\/strong><\/p>\n<p>\u4e00\u6b21\u8f6e\u8be2\u7684\u6570\u636e\u5305\u6570\u91cf\u4e0d\u80fd\u8d85\u8fc7\u5185\u6838\u53c2\u6570 net.core.netdev_budget \u6307\u5b9a\u7684\u6570\u91cf\uff08\u9ed8\u8ba4\u503c 300\uff09\uff0c\u5e76\u4e14\u8f6e\u8be2\u65f6\u95f4\u4e0d\u80fd\u8d85\u8fc7 2 \u4e2a\u65f6\u95f4\u7247\u3002\u8fd9\u4e2a\u673a\u5236\u4fdd\u8bc1\u4e86\u5355\u6b21\u8f6f\u4e2d\u65ad\u5904\u7406\u4e0d\u4f1a\u8017\u65f6\u592a\u4e45\u5f71\u54cd\u88ab\u4e2d\u65ad\u7684\u7a0b\u5e8f\u3002<\/p>\n<\/p>\n<pre>\/*&nbsp;\u6587\u4ef6\uff1anet\/core\/dev.c&nbsp;&nbsp;*\/&nbsp;\r\nstatic&nbsp;void&nbsp;net_rx_action(struct&nbsp;softirq_action&nbsp;*h)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;softnet_data&nbsp;*sd&nbsp;=&nbsp;&amp;__get_cpu_var(softnet_data);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;time_limit&nbsp;=&nbsp;jiffies&nbsp;+&nbsp;2;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;budget&nbsp;=&nbsp;netdev_budget;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*have;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;local_irq_disable();&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(!list_empty(&amp;sd-&gt;poll_list))&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;napi_struct&nbsp;*n;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;work,&nbsp;weight;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;If&nbsp;softirq&nbsp;window&nbsp;is&nbsp;exhuasted&nbsp;then&nbsp;punt.&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Allow&nbsp;this&nbsp;to&nbsp;run&nbsp;for&nbsp;2&nbsp;jiffies&nbsp;since&nbsp;which&nbsp;will&nbsp;allow&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;an&nbsp;average&nbsp;latency&nbsp;of&nbsp;1.5\/HZ.&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\u5224\u65ad\u5904\u7406\u5305\u6570\u662f\u5426\u8d85\u8fc7&nbsp;netdev_budget&nbsp;\u53ca\u65f6\u95f4\u662f\u5426\u8d85\u8fc72\u4e2a\u65f6\u95f4\u7247&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(unlikely(budget&nbsp;poll()&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;calls&nbsp;can&nbsp;remove&nbsp;this&nbsp;head&nbsp;entry&nbsp;from&nbsp;the&nbsp;list.&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;=&nbsp;list_first_entry(&amp;sd-&gt;poll_list,&nbsp;struct&nbsp;napi_struct,&nbsp;poll_list);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;have&nbsp;=&nbsp;netpoll_poll_lock(n);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;weight&nbsp;=&nbsp;n-&gt;weight;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;This&nbsp;NAPI_STATE_SCHED&nbsp;test&nbsp;is&nbsp;for&nbsp;avoiding&nbsp;a&nbsp;race&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;with&nbsp;netpoll's&nbsp;poll_napi().&nbsp;&nbsp;Only&nbsp;the&nbsp;entity&nbsp;which&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;obtains&nbsp;the&nbsp;lock&nbsp;and&nbsp;sees&nbsp;NAPI_STATE_SCHED&nbsp;set&nbsp;will&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;actually&nbsp;make&nbsp;the&nbsp;-&gt;poll()&nbsp;call.&nbsp;&nbsp;Therefore&nbsp;we&nbsp;avoid&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;accidentally&nbsp;calling&nbsp;-&gt;poll()&nbsp;when&nbsp;NAPI&nbsp;is&nbsp;not&nbsp;scheduled.&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;work&nbsp;=&nbsp;0;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(test_bit(NAPI_STATE_SCHED,&nbsp;&amp;n-&gt;state))&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;work&nbsp;=&nbsp;n-&gt;poll(n,&nbsp;weight);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace_napi_poll(n);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2026\u2026<\/pre>\n<\/p>\n<p><strong>(6) ixgbe_poll \u4e4b\u540e\u7684\u4e00\u7cfb\u5217\u8c03\u7528\u5c31\u4e0d\u4e00\u4e00\u8be6\u8ff0\u4e86\uff0c\u6709\u5174\u8da3\u7684\u540c\u5b66\u53ef\u4ee5\u81ea\u884c\u7814\u7a76\uff0c\u8f6f\u4e2d\u65ad\u90e8\u5206\u6709\u51e0\u4e2a\u5730\u65b9\u4f1a\u6709\u7c7b\u4f3c if (static_key_false(&amp;rps_needed))\u8fd9\u6837\u7684\u5224\u65ad\uff0c\u4f1a\u8fdb\u5165\u524d\u6587\u6240\u8ff0\u6709\u4e22\u5305\u98ce\u9669\u7684 enqueue_to_backlog \u51fd\u6570\u3002&nbsp;<\/strong><\/p>\n<p>\u8fd9\u91cc\u7684\u903b\u8f91\u4e3a\u5224\u65ad\u662f\u5426\u542f\u7528\u4e86 RPS \u673a\u5236\uff0cRPS \u662f\u65e9\u671f\u5355\u961f\u5217\u7f51\u5361\u4e0a\u5c06\u8f6f\u4e2d\u65ad\u8d1f\u8f7d\u5747\u8861\u5230\u591a\u4e2a CPU Core \u7684\u6280\u672f\uff0c\u5b83\u5bf9\u6570\u636e\u6d41\u8fdb\u884c hash \u5e76\u5206\u914d\u5230\u5bf9\u5e94\u7684 CPU Core \u4e0a\uff0c\u53d1\u6325\u591a\u6838\u7684\u6027\u80fd\u3002<\/p>\n<p>\u4e0d\u8fc7\u73b0\u5728\u57fa\u672c\u90fd\u662f\u591a\u961f\u5217\u7f51\u5361\uff0c\u4e0d\u4f1a\u5f00\u542f\u8fd9\u4e2a\u673a\u5236\uff0c\u56e0\u6b64\u8d70\u4e0d\u5230\u8fd9\u91cc\uff0cstatic_key_false \u662f\u9488\u5bf9\u9ed8\u8ba4\u4e3a false \u7684 static key \u7684\u4f18\u5316\u5224\u65ad\u65b9\u5f0f\u3002<\/p>\n<p>\u8fd9\u6bb5\u8c03\u7528\u7684\u6700\u540e\uff0cdeliver_skb \u4f1a\u5c06\u63a5\u6536\u7684\u6570\u636e\u4f20\u5165\u4e00\u4e2a IP \u5c42\u7684\u6570\u636e\u7ed3\u6784\u4e2d\uff0c\u81f3\u6b64\u5b8c\u6210\u4e8c\u5c42\u7684\u5168\u90e8\u5904\u7406\u3002<\/p>\n<\/p>\n<pre>&nbsp;*&nbsp;&nbsp;netif_receive_skb&nbsp;-&nbsp;process&nbsp;receive&nbsp;buffer&nbsp;from&nbsp;network&nbsp;\r\n&nbsp;*&nbsp;&nbsp;@skb:&nbsp;buffer&nbsp;to&nbsp;process&nbsp;\r\n&nbsp;*&nbsp;&nbsp;netif_receive_skb()&nbsp;is&nbsp;the&nbsp;main&nbsp;receive&nbsp;data&nbsp;processing&nbsp;function.&nbsp;\r\n&nbsp;*&nbsp;&nbsp;It&nbsp;always&nbsp;succeeds.&nbsp;The&nbsp;buffer&nbsp;may&nbsp;be&nbsp;dropped&nbsp;during&nbsp;processing&nbsp;\r\n&nbsp;*&nbsp;&nbsp;for&nbsp;congestion&nbsp;control&nbsp;or&nbsp;by&nbsp;the&nbsp;protocol&nbsp;layers.&nbsp;\r\n&nbsp;*&nbsp;&nbsp;This&nbsp;function&nbsp;may&nbsp;only&nbsp;be&nbsp;called&nbsp;from&nbsp;softirq&nbsp;context&nbsp;and&nbsp;interrupts&nbsp;\r\n&nbsp;*&nbsp;&nbsp;should&nbsp;be&nbsp;enabled.&nbsp;\r\n&nbsp;*&nbsp;&nbsp;Return&nbsp;values&nbsp;(usually&nbsp;ignored):&nbsp;\r\n&nbsp;*&nbsp;&nbsp;NET_RX_SUCCESS:&nbsp;no&nbsp;congestion&nbsp;\r\n&nbsp;*&nbsp;&nbsp;NET_RX_DROP:&nbsp;packet&nbsp;was&nbsp;dropped&nbsp;\r\nint&nbsp;netif_receive_skb(struct&nbsp;sk_buff&nbsp;*skb)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;net_timestamp_check(netdev_tstamp_prequeue,&nbsp;skb);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(skb_defer_rx_timestamp(skb))&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NET_RX_SUCCESS;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;rcu_read_lock();&nbsp;\r\n#ifdef&nbsp;CONFIG_RPS&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\u5224\u65ad\u662f\u5426\u542f\u7528RPS\u673a\u5236&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(static_key_false(&amp;rps_needed))&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;rps_dev_flow&nbsp;voidflow,&nbsp;*rflow&nbsp;=&nbsp;&amp;voidflow;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;\u83b7\u53d6\u5bf9\u5e94\u7684CPU&nbsp;Core&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;cpu&nbsp;=&nbsp;get_rps_cpu(skb-&gt;dev,&nbsp;skb,&nbsp;&amp;rflow);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cpu&nbsp;&gt;=&nbsp;0)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;enqueue_to_backlog(skb,&nbsp;cpu,&nbsp;&amp;rflow-&gt;last_qtail);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcu_read_unlock();&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;&nbsp;\r\n#endif&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;__netif_receive_skb(skb);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;rcu_read_unlock();&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<\/pre>\n<\/p>\n<p><strong><span style=\"font-size: large\">TCP\/IP \u534f\u8bae\u6808<\/span><\/strong><\/p>\n<p>TCP\/IP \u534f\u8bae\u6808\u9010\u5c42\u5904\u7406\uff0c\u6700\u7ec8\u4ea4\u7ed9\u7528\u6237\u7a7a\u95f4\u8bfb\u53d6\uff0c\u6570\u636e\u5305\u8fdb\u5230 IP \u5c42\u4e4b\u540e\uff0c\u7ecf\u8fc7 IP \u5c42\u3001TCP \u5c42\u5904\u7406\uff08\u6821\u9a8c\u3001\u89e3\u6790\u4e0a\u5c42\u534f\u8bae\uff0c\u53d1\u9001\u7ed9\u4e0a\u5c42\u534f\u8bae\uff09\uff0c\u653e\u5165 socket buffer\u3002<\/p>\n<p>\u5728\u5e94\u7528\u7a0b\u5e8f\u6267\u884c read() &nbsp;\u7cfb\u7edf\u8c03\u7528\u65f6\uff0c\u5c31\u80fd\u4ece socket buffer \u4e2d\u5c06\u65b0\u6570\u636e\u4ece\u5185\u6838\u533a\u62f7\u8d1d\u5230\u7528\u6237\u533a\uff0c\u5b8c\u6210\u8bfb\u53d6\u3002<\/p>\n<p>\u8fd9\u91cc\u7684 socket buffer \u5927\u5c0f\u5373 TCP \u63a5\u6536\u7a97\u53e3\uff0cTCP \u7531\u4e8e\u5177\u5907\u6d41\u91cf\u63a7\u5236\u529f\u80fd\uff0c\u80fd\u52a8\u6001\u8c03\u6574\u63a5\u6536\u7a97\u53e3\u5927\u5c0f\uff0c\u56e0\u6b64\u6570\u636e\u4f20\u8f93\u9636\u6bb5\u4e0d\u4f1a\u51fa\u73b0\u7531\u4e8e socket buffer \u63a5\u6536\u961f\u5217\u7a7a\u95f4\u4e0d\u8db3\u800c\u4e22\u5305\u7684\u60c5\u51b5\uff08\u4f46 UDP \u53ca TCP \u63e1\u624b\u9636\u6bb5\u4ecd\u4f1a\u6709\uff09\u3002<\/p>\n<p>\u6d89\u53ca TCP\/IP \u534f\u8bae\u7684\u90e8\u5206\u4e0d\u662f\u6b64\u6b21\u4e22\u5305\u95ee\u9898\u7684\u7814\u7a76\u91cd\u70b9\uff0c\u56e0\u6b64\u8fd9\u91cc\u4e0d\u518d\u8d58\u8ff0\u3002<\/p>\n<p><strong><span style=\"font-size: large\">\u7f51\u5361\u961f\u5217<\/span><\/strong><\/p>\n<p><strong>\u67e5\u770b\u7f51\u5361\u578b\u53f7<\/strong><\/p>\n<\/p>\n<pre>&nbsp;#&nbsp;lspci&nbsp;-vvv&nbsp;|&nbsp;grep&nbsp;Eth&nbsp;\r\n01:00.0&nbsp;Ethernet&nbsp;controller:&nbsp;Intel&nbsp;Corporation&nbsp;Ethernet&nbsp;Controller&nbsp;10-Gigabit&nbsp;X540-AT2&nbsp;(rev&nbsp;03)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subsystem:&nbsp;Dell&nbsp;Ethernet&nbsp;10G&nbsp;4P&nbsp;X540\/I350&nbsp;rNDC&nbsp;\r\n01:00.1&nbsp;Ethernet&nbsp;controller:&nbsp;Intel&nbsp;Corporation&nbsp;Ethernet&nbsp;Controller&nbsp;10-Gigabit&nbsp;X540-AT2&nbsp;(rev&nbsp;03)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subsystem:&nbsp;Dell&nbsp;Ethernet&nbsp;10G&nbsp;4P&nbsp;X540\/I350&nbsp;rNDC&nbsp;\r\n#&nbsp;lspci&nbsp;-vvv&nbsp;\r\n07:00.0&nbsp;Ethernet&nbsp;controller:&nbsp;Intel&nbsp;Corporation&nbsp;I350&nbsp;Gigabit&nbsp;Network&nbsp;Connection&nbsp;(rev&nbsp;01)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subsystem:&nbsp;Dell&nbsp;Gigabit&nbsp;4P&nbsp;X540\/I350&nbsp;rNDC&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Control:&nbsp;I\/O-&nbsp;Mem+&nbsp;BusMaster+&nbsp;SpecCycle-&nbsp;MemWINV-&nbsp;VGASnoop-&nbsp;ParErr-&nbsp;Stepping-&nbsp;SERR-&nbsp;FastB2B-&nbsp;DisINTx+&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Status:&nbsp;Cap+&nbsp;66MHz-&nbsp;UDF-&nbsp;FastB2B-&nbsp;ParErr-&nbsp;DEVSEL=fast&nbsp;&gt;TAbort-&nbsp;\n   \n    SERR-&nbsp;\n    \n     <p><\/p>\n     <p>\u53ef\u4ee5\u770b\u51fa\uff0c\u7f51\u5361\u7684\u4e2d\u65ad\u673a\u5236\u662f MSI-X\uff0c\u5373\u7f51\u5361\u7684\u6bcf\u4e2a\u961f\u5217\u90fd\u53ef\u4ee5\u5206\u914d\u4e2d\u65ad\uff08MSI-X \u652f\u6301 2048 \u4e2a\u4e2d\u65ad\uff09\u3002<\/p>\n     <p><strong>\u7f51\u5361\u961f\u5217<\/strong><\/p>\n     <p><\/p>\n     <pre>&nbsp;#define&nbsp;IXGBE_MAX_MSIX_VECTORS_82599&nbsp;&nbsp;&nbsp;&nbsp;0x40&nbsp;\r\n&nbsp;&nbsp;u16&nbsp;ixgbe_get_pcie_msix_count_generic(struct&nbsp;ixgbe_hw&nbsp;*hw)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u16&nbsp;msix_count;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u16&nbsp;max_msix_count;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u16&nbsp;pcie_offset;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(hw-&gt;mac.type)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ixgbe_mac_82598EB:&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pcie_offset&nbsp;=&nbsp;IXGBE_PCIE_MSIX_82598_CAPS;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_msix_count&nbsp;=&nbsp;IXGBE_MAX_MSIX_VECTORS_82598;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ixgbe_mac_82599EB:&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ixgbe_mac_X540:&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ixgbe_mac_X550:&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ixgbe_mac_X550EM_x:&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ixgbe_mac_x550em_a:&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pcie_offset&nbsp;=&nbsp;IXGBE_PCIE_MSIX_82599_CAPS;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_msix_count&nbsp;=&nbsp;IXGBE_MAX_MSIX_VECTORS_82599;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<\/pre>\n<\/p>\n<p>\u6839\u636e\u7f51\u5361\u578b\u53f7\u786e\u5b9a\u9a71\u52a8\u4e2d\u5b9a\u4e49\u7684\u7f51\u5361\u961f\u5217\uff0c\u53ef\u4ee5\u770b\u5230 X540 \u7f51\u5361\u9a71\u52a8\u4e2d\u5b9a\u4e49\u6700\u5927\u652f\u6301\u7684 IRQ Vector \u4e3a 0x40(\u6570\u503c\uff1a64)\u3002<\/p>\n<\/p>\n<pre>static&nbsp;int&nbsp;ixgbe_acquire_msix_vectors(struct&nbsp;ixgbe_adapter&nbsp;*adapter)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;ixgbe_hw&nbsp;*hw&nbsp;=&nbsp;&amp;adapter-&gt;hw;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i,&nbsp;vectors,&nbsp;vector_threshold;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;We&nbsp;start&nbsp;by&nbsp;asking&nbsp;for&nbsp;one&nbsp;vector&nbsp;per&nbsp;queue&nbsp;pair&nbsp;with&nbsp;XDP&nbsp;queues&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;being&nbsp;stacked&nbsp;with&nbsp;TX&nbsp;queues.&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;vectors&nbsp;=&nbsp;max(adapter-&gt;num_rx_queues,&nbsp;adapter-&gt;num_tx_queues);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;vectors&nbsp;=&nbsp;max(vectors,&nbsp;adapter-&gt;num_xdp_queues);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;It&nbsp;is&nbsp;easy&nbsp;to&nbsp;be&nbsp;greedy&nbsp;for&nbsp;MSI-X&nbsp;vectors.&nbsp;However,&nbsp;it&nbsp;really&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;doesn't&nbsp;do&nbsp;much&nbsp;good&nbsp;if&nbsp;we&nbsp;have&nbsp;a&nbsp;lot&nbsp;more&nbsp;vectors&nbsp;than&nbsp;CPUs.&nbsp;We'll&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;be&nbsp;somewhat&nbsp;conservative&nbsp;and&nbsp;only&nbsp;ask&nbsp;for&nbsp;(roughly)&nbsp;the&nbsp;same&nbsp;number&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;of&nbsp;vectors&nbsp;as&nbsp;there&nbsp;are&nbsp;CPUs.&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;vectors&nbsp;=&nbsp;min_t(int,&nbsp;vectors,&nbsp;num_online_cpus());<\/pre>\n<\/p>\n<p>\u901a\u8fc7\u52a0\u8f7d\u7f51\u5361\u9a71\u52a8\uff0c\u83b7\u53d6\u7f51\u5361\u578b\u53f7\u548c\u7f51\u5361\u786c\u4ef6\u7684\u961f\u5217\u6570\uff1b\u4f46\u662f\u5728\u521d\u59cb\u5316 misx vector \u7684\u65f6\u5019\uff0c\u8fd8\u4f1a\u7ed3\u5408\u7cfb\u7edf\u5728\u7ebf CPU \u7684\u6570\u91cf\uff0c\u901a\u8fc7 Sum = Min(\u7f51\u5361\u961f\u5217\uff0cCPU Core) \u6765\u6fc0\u6d3b\u76f8\u5e94\u7684\u7f51\u5361\u961f\u5217\u6570\u91cf\uff0c\u5e76\u7533\u8bf7 Sum \u4e2a\u4e2d\u65ad\u53f7\u3002<\/p>\n<p>\u5982\u679c CPU \u6570\u91cf\u5c0f\u4e8e 64\uff0c\u4f1a\u751f\u6210 CPU \u6570\u91cf\u7684\u961f\u5217\uff0c\u4e5f\u5c31\u662f\u6bcf\u4e2a CPU \u4f1a\u4ea7\u751f\u4e00\u4e2a external IRQ\u3002<\/p>\n<p>\u6211\u4eec\u7ebf\u4e0a\u7684 CPU \u4e00\u822c\u662f 48 \u4e2a\u903b\u8f91 Core\uff0c\u5c31\u4f1a\u751f\u6210 48 \u4e2a\u4e2d\u65ad\u53f7\uff0c\u7531\u4e8e\u6211\u4eec\u662f\u4e24\u5757\u7f51\u5361\u505a\u4e86 bond\uff0c\u4e5f\u5c31\u4f1a\u751f\u6210 96 \u4e2a\u4e2d\u65ad\u53f7\u3002<\/p>\n<p><strong><span style=\"font-size: x-large\">\u9a8c\u8bc1\u4e0e\u590d\u73b0\u7f51\u7edc\u4e22\u5305<\/span><\/strong><\/p>\n<p>\u901a\u8fc7\u9738\u7237\u7684\u4e00\u7bc7\u6587\u7ae0\uff0c\u6211\u4eec\u5728\u6d4b\u8bd5\u73af\u5883\u505a\u4e86\u6d4b\u8bd5\uff0c\u53d1\u73b0\u6d4b\u8bd5\u73af\u5883\u7684\u4e2d\u65ad\u786e\u5b9e\u6709\u96c6\u4e2d\u5728 CPU 0 \u7684\u60c5\u51b5\u3002<\/p>\n<p>\u4e0b\u9762\u4f7f\u7528 systemtap \u8bca\u65ad\u6d4b\u8bd5\u73af\u5883\u8f6f\u4e2d\u65ad\u5206\u5e03\u7684\u65b9\u6cd5\uff1a<\/p>\n<\/p>\n<pre>global&nbsp;hard,&nbsp;soft,&nbsp;wq&nbsp;\r\nprobe&nbsp;irq_handler.entry&nbsp;{&nbsp;\r\nhard[irq,&nbsp;dev_name]++;&nbsp;\r\nprobe&nbsp;timer.s(1)&nbsp;{&nbsp;\r\nprintln(\"==irq&nbsp;number:dev_name\")&nbsp;\r\nforeach(&nbsp;[irq,&nbsp;dev_name]&nbsp;in&nbsp;hard-&nbsp;limit&nbsp;5)&nbsp;{&nbsp;\r\nprintf(\"%d,%s-&gt;%dn\",&nbsp;irq,&nbsp;kernel_string(dev_name),&nbsp;hard[irq,&nbsp;dev_name]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\nprintln(\"==softirq&nbsp;cpu:h:vec:action\")&nbsp;\r\nforeach(&nbsp;[c,h,vec,action]&nbsp;in&nbsp;soft-&nbsp;limit&nbsp;5)&nbsp;{&nbsp;\r\nprintf(\"%d:%x:%x:%s-&gt;%dn\",&nbsp;c,&nbsp;h,&nbsp;vec,&nbsp;symdata(action),&nbsp;soft[c,h,vec,action]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\nprintln(\"==workqueue&nbsp;wq_thread:work_func\")&nbsp;\r\nforeach(&nbsp;[wq_thread,work_func]&nbsp;in&nbsp;wq-&nbsp;limit&nbsp;5)&nbsp;{&nbsp;\r\nprintf(\"%x:%x-&gt;%dn\",&nbsp;wq_thread,&nbsp;work_func,&nbsp;wq[wq_thread,&nbsp;work_func]);&nbsp;&nbsp;\r\nprintln(\"n\")&nbsp;\r\ndelete&nbsp;hard&nbsp;\r\ndelete&nbsp;soft&nbsp;\r\ndelete&nbsp;wq&nbsp;\r\nprobe&nbsp;softirq.entry&nbsp;{&nbsp;\r\nsoft[cpu(),&nbsp;h,vec,action]++;&nbsp;\r\nprobe&nbsp;workqueue.execute&nbsp;{&nbsp;\r\nwq[wq_thread,&nbsp;work_func]++&nbsp;\r\nprobe&nbsp;begin&nbsp;{&nbsp;\r\nprintln(\"~\")<\/pre>\n<\/p>\n<p>\u4e0b\u9762\u6267\u884c i.stap \u7684\u7ed3\u679c\uff1a<\/p>\n<\/p>\n<pre>==irq&nbsp;number:dev_name&nbsp;\r\n87,eth0-0-&gt;1693&nbsp;\r\n90,eth0-3-&gt;1263&nbsp;\r\n95,eth1-3-&gt;746&nbsp;\r\n92,eth1-0-&gt;703&nbsp;\r\n89,eth0-2-&gt;654&nbsp;\r\n==softirq&nbsp;cpu:h:vec:action&nbsp;\r\n0:ffffffff81a83098:ffffffff81a83080:0xffffffff81461a00-&gt;8928&nbsp;\r\n0:ffffffff81a83088:ffffffff81a83080:0xffffffff81084940-&gt;626&nbsp;\r\n0:ffffffff81a830c8:ffffffff81a83080:0xffffffff810ecd70-&gt;614&nbsp;\r\n16:ffffffff81a83088:ffffffff81a83080:0xffffffff81084940-&gt;225&nbsp;\r\n16:ffffffff81a830c8:ffffffff81a83080:0xffffffff810ecd70-&gt;224&nbsp;\r\n==workqueue&nbsp;wq_thread:work_func&nbsp;\r\nffff88083062aae0:ffffffffa01c53d0-&gt;10&nbsp;\r\nffff88083062aae0:ffffffffa01ca8f0-&gt;10&nbsp;\r\nffff88083420a080:ffffffff81142160-&gt;2&nbsp;\r\nffff8808343fe040:ffffffff8127c9d0-&gt;2&nbsp;\r\nffff880834282ae0:ffffffff8133bd20-&gt;1<\/pre>\n<\/p>\n<p>\u4e0b\u9762\u662f action \u5bf9\u5e94\u7684\u7b26\u53f7\u4fe1\u606f\uff1a<\/p>\n<\/p>\n<pre>addr2line&nbsp;-e&nbsp;\/usr\/lib\/debug\/lib\/modules\/2.6.32-431.20.3.el6.mt20161028.x86_64\/vmlinux&nbsp;ffffffff81461a00&nbsp;\r\n\/usr\/src\/debug\/kernel-2.6.32-431.20.3.el6\/linux-2.6.32-431.20.3.el6.mt20161028.x86_64\/net\/core\/dev.c:4013<\/pre>\n<\/p>\n<p>\u6253\u5f00\u8fd9\u4e2a\u6587\u4ef6\uff0c\u6211\u4eec\u53d1\u73b0\u5b83\u662f\u5728\u6267\u884c static void net_rx_action(struct softirq_action *h)\u8fd9\u4e2a\u51fd\u6570\uff0c\u800c\u8fd9\u4e2a\u51fd\u6570\u6b63\u662f\u524d\u6587\u63d0\u5230\u7684\uff0cNET_RX_SOFTIRQ \u5bf9\u5e94\u7684\u8f6f\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f\u3002<\/p>\n<p>\u56e0\u6b64\u53ef\u4ee5\u786e\u8ba4\u7f51\u5361\u7684\u8f6f\u4e2d\u65ad\u5728\u673a\u5668\u4e0a\u5206\u5e03\u975e\u5e38\u4e0d\u5747\uff0c\u800c\u4e14\u4e3b\u8981\u96c6\u4e2d\u5728 CPU 0 \u4e0a\u3002<\/p>\n<p>\u901a\u8fc7 \/proc\/interrupts \u80fd\u786e\u8ba4\u786c\u4e2d\u65ad\u96c6\u4e2d\u5728 CPU 0 \u4e0a\uff0c\u56e0\u6b64\u8f6f\u4e2d\u65ad\u4e5f\u90fd\u7531 CPU 0 \u5904\u7406\uff0c\u5982\u4f55\u4f18\u5316\u7f51\u5361\u7684\u4e2d\u65ad\u6210\u4e3a\u4e86\u6211\u4eec\u5173\u6ce8\u7684\u91cd\u70b9\u3002<\/p>\n<p><strong><span style=\"font-size: x-large\">\u4f18\u5316\u7b56\u7565<\/span><\/strong><\/p>\n<p><strong><span style=\"font-size: large\">CPU \u4eb2\u7f18\u6027<\/span><\/strong><\/p>\n<p>\u524d\u6587\u63d0\u5230\uff0c\u4e22\u5305\u662f\u56e0\u4e3a\u961f\u5217\u4e2d\u7684\u6570\u636e\u5305\u8d85\u8fc7\u4e86 netdev_max_backlog \u9020\u6210\u4e86\u4e22\u5f03\uff0c\u56e0\u6b64\u9996\u5148\u60f3\u5230\u662f\u4e34\u65f6\u8c03\u5927 netdev_max_backlog \u80fd\u5426\u89e3\u51b3\u71c3\u7709\u4e4b\u6025\u3002<\/p>\n<p>\u4e8b\u5b9e\u8bc1\u660e\uff0c\u5bf9\u4e8e\u8f7b\u5fae\u4e22\u5305\u8c03\u5927\u53c2\u6570\u53ef\u4ee5\u7f13\u89e3\u4e22\u5305\uff0c\u4f46\u5bf9\u4e8e\u5927\u91cf\u4e22\u5305\u5219\u51e0\u4e4e\u4e0d\u600e\u4e48\u7ba1\u7528\u3002<\/p>\n<p>\u5185\u6838\u5904\u7406\u901f\u5ea6\u8ddf\u4e0d\u4e0a\u6536\u5305\u901f\u5ea6\u7684\u95ee\u9898\u8fd8\u662f\u5ba2\u89c2\u5b58\u5728\uff0c\u672c\u8d28\u8fd8\u662f\u56e0\u4e3a\u5355\u6838\u5904\u7406\u4e2d\u65ad\u6709\u74f6\u9888\uff0c\u5373\u4f7f\u4e0d\u4e22\u5305\uff0c\u670d\u52a1\u54cd\u5e94\u901f\u5ea6\u4e5f\u4f1a\u53d8\u6162\u3002<\/p>\n<p>\u56e0\u6b64\u5982\u679c\u80fd\u540c\u65f6\u4f7f\u7528\u591a\u4e2a CPU Core \u6765\u5904\u7406\u4e2d\u65ad\uff0c\u5c31\u80fd\u663e\u8457\u63d0\u9ad8\u4e2d\u65ad\u5904\u7406\u7684\u6548\u7387\uff0c\u5e76\u4e14\u6bcf\u4e2a CPU \u90fd\u4f1a\u5b9e\u4f8b\u5316\u4e00\u4e2a softnet_data \u5bf9\u8c61\uff0c\u961f\u5217\u6570\u4e5f\u589e\u52a0\u4e86\u3002<\/p>\n<p><strong><span style=\"font-size: large\">\u4e2d\u65ad\u4eb2\u7f18\u6027\u8bbe\u7f6e<\/span><\/strong><\/p>\n<p>\u901a\u8fc7\u8bbe\u7f6e\u4e2d\u65ad\u4eb2\u7f18\u6027\uff0c\u53ef\u4ee5\u8ba9\u6307\u5b9a\u7684\u4e2d\u65ad\u5411\u91cf\u53f7\u66f4\u503e\u5411\u4e8e\u53d1\u9001\u7ed9\u6307\u5b9a\u7684 CPU Core \u6765\u5904\u7406\uff0c\u4fd7\u79f0\u201c\u7ed1\u6838\u201d\u3002<\/p>\n<p>\u547d\u4ee4 grep eth \/proc\/interrupts \u7684\u7b2c\u4e00\u5217\u53ef\u4ee5\u83b7\u53d6\u7f51\u5361\u7684\u4e2d\u65ad\u53f7\uff0c\u5982\u679c\u662f\u591a\u961f\u5217\u7f51\u5361\uff0c\u90a3\u4e48\u5c31\u4f1a\u6709\u591a\u884c\u8f93\u51fa\uff1a<\/p>\n<\/p>\n<p>\u4e2d\u65ad\u7684\u4eb2\u7f18\u6027\u8bbe\u7f6e\u53ef\u4ee5\u5728 cat \/proc\/irq\/${\u4e2d\u65ad\u53f7}\/smp_affinity \u6216 cat \/proc\/irq\/${\u4e2d\u65ad\u53f7}\/smp_affinity_list \u4e2d\u786e\u8ba4\uff0c\u524d\u8005\u662f 16 \u8fdb\u5236\u63a9\u7801\u5f62\u5f0f\uff0c\u540e\u8005\u662f\u4ee5 CPU Core \u5e8f\u53f7\u5f62\u5f0f\u3002<\/p>\n<p>\u4f8b\u5982\u4e0b\u56fe\u4e2d\uff0c\u5c06 16 \u8fdb\u5236\u7684 400 \u8f6c\u6362\u6210 2 \u8fdb\u5236\u540e\uff0c\u4e3a 10000000000\uff0c\u201c1\u201d\u5728\u7b2c 10 \u4f4d\u4e0a\uff0c\u8868\u793a\u4eb2\u7f18\u6027\u662f\u7b2c 10 \u4e2a CPU Core\u3002<\/p>\n<p>\u90a3\u4e3a\u4ec0\u4e48\u4e2d\u65ad\u53f7\u53ea\u8bbe\u7f6e\u4e00\u4e2a CPU Core \u5462\uff1f\u800c\u4e0d\u662f\u4e3a\u6bcf\u4e00\u4e2a\u4e2d\u65ad\u53f7\u8bbe\u7f6e\u591a\u4e2a CPU Core \u5e73\u884c\u5904\u7406\u3002<\/p>\n<\/p>\n<p>\u6211\u4eec\u7ecf\u8fc7\u6d4b\u8bd5\uff0c\u53d1\u73b0\u5f53\u7ed9\u4e2d\u65ad\u8bbe\u7f6e\u4e86\u591a\u4e2a CPU Core \u540e\uff0c\u5b83\u4e5f\u4ec5\u80fd\u7531\u8bbe\u7f6e\u7684\u7b2c\u4e00\u4e2a CPU Core \u6765\u5904\u7406\uff0c\u5176\u4ed6\u7684 CPU Core \u5e76\u4e0d\u4f1a\u53c2\u4e0e\u4e2d\u65ad\u5904\u7406\u3002<\/p>\n<p>\u539f\u56e0\u731c\u60f3\u662f\u5f53 CPU \u53ef\u4ee5\u5e73\u884c\u6536\u5305\u65f6\uff0c\u4e0d\u540c\u7684\u6838\u6536\u53d6\u4e86\u540c\u4e00\u4e2a queue \u7684\u6570\u636e\u5305\uff0c\u4f46\u5904\u7406\u901f\u5ea6\u4e0d\u4e00\u81f4\uff0c\u5bfc\u81f4\u63d0\u4ea4\u5230 IP \u5c42\u540e\u7684\u987a\u5e8f\u4e5f\u4e0d\u4e00\u81f4\uff0c\u8fd9\u5c31\u4f1a\u4ea7\u751f\u4e71\u5e8f\u7684\u95ee\u9898\uff0c\u7531\u540c\u4e00\u4e2a\u6838\u6765\u5904\u7406\u53ef\u4ee5\u907f\u514d\u4e71\u5e8f\u95ee\u9898\u3002<\/p>\n<p>\u4f46\u662f\uff0c\u5f53\u6211\u4eec\u914d\u7f6e\u4e86\u591a\u4e2a Core \u5904\u7406\u4e2d\u65ad\u540e\uff0c\u53d1\u73b0 Redis \u7684\u6162\u67e5\u8be2\u6570\u91cf\u6709\u660e\u663e\u4e0a\u5347\uff0c\u751a\u81f3\u90e8\u5206\u4e1a\u52a1\u4e5f\u53d7\u5230\u4e86\u5f71\u54cd\uff0c\u6162\u67e5\u8be2\u589e\u591a\u76f4\u63a5\u5bfc\u81f4\u53ef\u7528\u6027\u964d\u4f4e\uff0c\u56e0\u6b64\u65b9\u6848\u4ecd\u9700\u8fdb\u4e00\u6b65\u4f18\u5316\u3002<\/p>\n<\/p>\n<p><strong><span style=\"font-size: large\">Redis \u8fdb\u7a0b\u4eb2\u7f18\u6027\u8bbe\u7f6e<\/span><\/strong><\/p>\n<p>\u5982\u679c\u67d0\u4e2a CPU Core \u6b63\u5728\u5904\u7406 Redis \u7684\u8c03\u7528\uff0c\u6267\u884c\u5230\u4e00\u534a\u65f6\u4ea7\u751f\u4e86\u4e2d\u65ad\uff0c\u90a3\u4e48 CPU \u4e0d\u5f97\u4e0d\u505c\u6b62\u5f53\u524d\u7684\u5de5\u4f5c\u8f6c\u800c\u5904\u7406\u4e2d\u65ad\u8bf7\u6c42\u3002<\/p>\n<p>\u4e2d\u65ad\u671f\u95f4 Redis \u4e5f\u65e0\u6cd5\u8f6c\u4ea4\u7ed9\u5176\u4ed6 Core \u7ee7\u7eed\u8fd0\u884c\uff0c\u5fc5\u987b\u7b49\u5904\u7406\u5b8c\u4e2d\u65ad\u540e\u624d\u80fd\u7ee7\u7eed\u8fd0\u884c\u3002<\/p>\n<p>Redis \u672c\u8eab\u5b9a\u4f4d\u5c31\u662f\u9ad8\u901f\u7f13\u5b58\uff0c\u7ebf\u4e0a\u7684\u5e73\u5747\u7aef\u5230\u7aef\u54cd\u5e94\u65f6\u95f4\u5c0f\u4e8e 1ms\uff0c\u5982\u679c\u9891\u7e41\u88ab\u4e2d\u65ad\uff0c\u90a3\u4e48\u54cd\u5e94\u65f6\u95f4\u5fc5\u7136\u53d7\u5230\u6781\u5927\u5f71\u54cd\u3002<\/p>\n<p>\u5bb9\u6613\u60f3\u5230\uff0c\u7531\u6700\u521d\u7684 CPU 0 \u5355\u6838\u5904\u7406\u4e2d\u65ad\uff0c\u6539\u8fdb\u5230\u591a\u6838\u5904\u7406\u4e2d\u65ad\uff0cRedis \u8fdb\u7a0b\u88ab\u4e2d\u65ad\u5f71\u54cd\u7684\u51e0\u7387\u589e\u5927\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u5bf9 Redis \u8fdb\u7a0b\u4e5f\u8bbe\u7f6e CPU \u4eb2\u7f18\u6027\uff0c\u4f7f\u5176\u4e0e\u5904\u7406\u4e2d\u65ad\u7684 Core \u4e92\u76f8\u9519\u5f00\uff0c\u907f\u514d\u53d7\u5230\u5f71\u54cd\u3002<\/p>\n<p>\u4f7f\u7528\u547d\u4ee4 taskset \u53ef\u4ee5\u4e3a\u8fdb\u7a0b\u8bbe\u7f6e CPU \u4eb2\u7f18\u6027\uff0c\u64cd\u4f5c\u5341\u5206\u7b80\u5355\uff0c\u4e00\u53e5 taskset -cp cpu-list pid \u5373\u53ef\u5b8c\u6210\u7ed1\u5b9a\u3002<\/p>\n<p>\u7ecf\u8fc7\u4e00\u756a\u538b\u6d4b\uff0c\u6211\u4eec\u53d1\u73b0\u4f7f\u7528 8 \u4e2a Core \u5904\u7406\u4e2d\u65ad\u65f6\uff0c\u6d41\u91cf\u76f4\u81f3\u6253\u6ee1\u53cc\u4e07\u5146\u7f51\u5361\u4e5f\u4e0d\u4f1a\u51fa\u73b0\u4e22\u5305\uff0c\u56e0\u6b64\u51b3\u5b9a\u5c06\u4e2d\u65ad\u7684\u4eb2\u7f18\u6027\u8bbe\u7f6e\u4e3a\u7269\u7406\u673a\u4e0a\u524d 8 \u4e2a Core\uff0cRedis \u8fdb\u7a0b\u7684\u4eb2\u7f18\u6027\u8bbe\u7f6e\u4e3a\u5269\u4e0b\u7684\u6240\u6709 Core\u3002<\/p>\n<p>\u8c03\u6574\u540e\uff0c\u786e\u5b9e\u6709\u660e\u663e\u7684\u6548\u679c\uff0c\u6162\u67e5\u8be2\u6570\u91cf\u5927\u5e45\u4f18\u5316\uff0c\u4f46\u5bf9\u6bd4\u521d\u59cb\u60c5\u51b5\uff0c\u4ecd\u7136\u8fd8\u662f\u9ad8\u4e86\u4e00\u4e9b\u4e9b\uff0c\u8fd8\u6709\u6ca1\u6709\u4f18\u5316\u7a7a\u95f4\u5462\uff1f<\/p>\n<\/p>\n<p>\u901a\u8fc7\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\u4e00\u4e2a\u6709\u8da3\u7684\u73b0\u8c61\uff0c\u5f53\u53ea\u6709 CPU 0 \u5904\u7406\u4e2d\u65ad\u65f6\uff0cRedis \u8fdb\u7a0b\u66f4\u503e\u5411\u4e8e\u8fd0\u884c\u5728 CPU 0\uff0c\u4ee5\u53ca CPU 0 \u540c\u4e00\u7269\u7406 CPU \u4e0b\u7684\u5176\u4ed6\u6838\u4e0a\u3002<\/p>\n<p>\u4e8e\u662f\u6709\u4e86\u4ee5\u4e0b\u63a8\u6d4b\uff1a\u6211\u4eec\u8bbe\u7f6e\u7684\u4e2d\u65ad\u4eb2\u7f18\u6027\uff0c\u662f\u76f4\u63a5\u9009\u53d6\u4e86\u524d 8 \u4e2a\u6838\u5fc3\uff0c\u4f46\u8fd9 8 \u4e2a Core \u5374\u53ef\u80fd\u662f\u6765\u81ea\u4e24\u5757\u7269\u7406 CPU \u7684\u3002<\/p>\n<p>\u5728 \/proc\/cpuinfo \u4e2d\uff0c\u901a\u8fc7\u5b57\u6bb5 processor \u548c physical id \u80fd\u786e\u8ba4\u8fd9\u4e00\u70b9\uff0c\u90a3\u4e48\u54cd\u5e94\u6162\u662f\u5426\u548c\u7269\u7406 CPU \u6709\u5173\u5462\uff1f<\/p>\n<p>\u7269\u7406 CPU \u53c8\u548c NUMA \u67b6\u6784\u5173\u8054\uff0c\u6bcf\u4e2a\u7269\u7406 CPU \u5bf9\u5e94\u4e00\u4e2a NUMA node\uff0c\u90a3\u4e48\u63a5\u4e0b\u6765\u5c31\u8981\u4ece NUMA \u89d2\u5ea6\u8fdb\u884c\u5206\u6790\u3002<\/p>\n<\/p>\n<p><strong><span style=\"font-size: x-large\">NUMA<\/span><\/strong><\/p>\n<p><span style=\"font-size: large\"><strong>SMP \u67b6\u6784<\/strong><\/span><\/p>\n<p>\u968f\u7740\u5355\u6838 CPU \u7684\u9891\u7387\u5728\u5236\u9020\u5de5\u827a\u4e0a\u7684\u74f6\u9888\uff0cCPU \u5236\u9020\u5546\u7684\u53d1\u5c55\u65b9\u5411\u4e5f\u7531\u7eb5\u5411\u53d8\u4e3a\u6a2a\u5411\uff1a\u4ece CPU \u9891\u7387\u8f6c\u4e3a\u6bcf\u74e6\u6027\u80fd\u3002CPU \u4e5f\u5c31\u4ece\u5355\u6838\u9891\u7387\u65f6\u4ee3\u8fc7\u6e21\u5230\u591a\u6838\u6027\u80fd\u534f\u8c03\u3002<\/p>\n<p>SMP(\u5bf9\u79f0\u591a\u5904\u7406\u7ed3\u6784)\uff1a\u5373 CPU \u5171\u4eab\u6240\u6709\u8d44\u6e90\uff0c\u4f8b\u5982\u603b\u7ebf\u3001\u5185\u5b58\u3001IO \u7b49\u3002<\/p>\n<p>SMP \u7ed3\u6784\uff1a\u4e00\u4e2a\u7269\u7406 CPU \u53ef\u4ee5\u6709\u591a\u4e2a\u7269\u7406 Core\uff0c\u6bcf\u4e2a Core \u53c8\u53ef\u4ee5\u6709\u591a\u4e2a\u786c\u4ef6\u7ebf\u7a0b\u3002<\/p>\n<p>\u5373\uff1a\u6bcf\u4e2a HT \u6709\u4e00\u4e2a\u72ec\u7acb\u7684 L1 cache\uff0c\u540c\u4e00\u4e2a Core \u4e0b\u7684 HT \u5171\u4eab L2 cache\uff0c\u540c\u4e00\u4e2a\u7269\u7406 CPU \u4e0b\u7684\u591a\u4e2a Core \u5171\u4eab L3 cache\u3002<\/p>\n<p>\u4e0b\u56fe(\u6458\u81ea\u5185\u6838\u6708\u8c08)\u4e2d\uff0c\u4e00\u4e2a x86 CPU \u6709 4 \u4e2a\u7269\u7406 Core\uff0c\u6bcf\u4e2a Core \u6709\u4e24\u4e2a HT(Hyper Thread)\uff1a<\/p>\n<\/p>\n<p><strong><span style=\"font-size: large\">NUMA \u67b6\u6784<\/span><\/strong><\/p>\n<p>\u5728\u524d\u9762\u7684 FSB(\u524d\u7aef\u7cfb\u7edf\u603b\u7ebf)\u7ed3\u6784\u4e2d\uff0c\u5f53 CPU \u4e0d\u65ad\u589e\u957f\u7684\u60c5\u51b5\u4e0b\uff0c\u5171\u4eab\u7684\u7cfb\u7edf\u603b\u7ebf\u5c31\u4f1a\u56e0\u4e3a\u8d44\u6e90\u7ade\u4e89(\u591a\u6838\u4e89\u62a2\u603b\u7ebf\u8d44\u6e90\u4ee5\u8bbf\u95ee\u5317\u6865\u4e0a\u7684\u5185\u5b58)\u800c\u51fa\u73b0\u6269\u5c55\u548c\u6027\u80fd\u95ee\u9898\u3002<\/p>\n<p>\u5728\u8fd9\u6837\u7684\u80cc\u666f\u4e0b\uff0c\u57fa\u4e8e SMP \u67b6\u6784\u4e0a\u7684\u4f18\u5316\uff0c\u8bbe\u8ba1\u51fa\u4e86 NUMA(Non-Uniform Memory Access)\u2014\u2014 \u975e\u5747\u5300\u5185\u5b58\u8bbf\u95ee\u3002<\/p>\n<p>\u5185\u5b58\u63a7\u5236\u5668\u82af\u7247\u88ab\u96c6\u6210\u5230\u5904\u7406\u5668\u5185\u90e8\uff0c\u591a\u4e2a\u5904\u7406\u5668\u901a\u8fc7 QPI \u94fe\u8def\u76f8\u8fde\uff0cDRAM \u4e5f\u5c31\u6709\u4e86\u8fdc\u8fd1\u4e4b\u5206\u3002(\u5982\u4e0b\u56fe\u6240\u793a\uff1a\u6458\u81ea CPU Cache)<\/p>\n<p>CPU \u591a\u5c42 Cache \u7684\u6027\u80fd\u5dee\u5f02\u662f\u5f88\u5de8\u5927\u7684\uff0c\u6bd4\u5982\uff1aL1 \u7684\u8bbf\u95ee\u65f6\u957f 1ns\uff0cL2 \u7684\u65f6\u957f 3ns\u2026\u8de8 Node \u7684\u8bbf\u95ee\u4f1a\u6709\u51e0\u5341\u751a\u81f3\u4e0a\u767e\u500d\u7684\u6027\u80fd\u635f\u8017\u3002<\/p>\n<\/p>\n<p><strong><span style=\"font-size: large\">NUMA \u67b6\u6784\u4e0b\u7684\u4e2d\u65ad\u4f18\u5316<\/span><\/strong><\/p>\n<p>\u8fd9\u65f6\u6211\u4eec\u518d\u56de\u5f52\u5230\u4e2d\u65ad\u7684\u95ee\u9898\u4e0a\uff0c\u5f53\u4e24\u4e2a NUMA \u8282\u70b9\u5904\u7406\u4e2d\u65ad\u65f6\uff0cCPU \u5b9e\u4f8b\u5316\u7684 softnet_data \u4ee5\u53ca\u9a71\u52a8\u5206\u914d\u7684 sk_buffer \u90fd\u53ef\u80fd\u662f\u8de8 Node \u7684\u3002<\/p>\n<p>\u6570\u636e\u63a5\u6536\u540e\u5bf9\u4e0a\u5c42\u5e94\u7528 Redis \u6765\u8bf4\uff0c\u8de8 Node \u8bbf\u95ee\u7684\u51e0\u7387\u4e5f\u5927\u5927\u63d0\u9ad8\uff0c\u5e76\u4e14\u65e0\u6cd5\u5145\u5206\u5229\u7528 L2\u3001L3 cache\uff0c\u589e\u52a0\u4e86\u5ef6\u65f6\u3002<\/p>\n<p>\u540c\u65f6\uff0c\u7531\u4e8e Linux wake affinity \u7279\u6027\uff0c\u5982\u679c\u4e24\u4e2a\u8fdb\u7a0b\u9891\u7e41\u4e92\u52a8\uff0c\u8c03\u5ea6\u7cfb\u7edf\u4f1a\u89c9\u5f97\u5b83\u4eec\u5f88\u6709\u53ef\u80fd\u5171\u4eab\u540c\u6837\u7684\u6570\u636e\uff0c\u628a\u5b83\u4eec\u653e\u5230\u540c\u4e00 CPU \u6838\u5fc3\u6216 NUMA Node \u6709\u52a9\u4e8e\u63d0\u9ad8\u7f13\u5b58\u548c\u5185\u5b58\u7684\u8bbf\u95ee\u6027\u80fd\u3002<\/p>\n<p>\u6240\u4ee5\u5f53\u4e00\u4e2a\u8fdb\u7a0b\u5524\u9192\u53e6\u4e00\u4e2a\u7684\u65f6\u5019\uff0c\u88ab\u5524\u9192\u7684\u8fdb\u7a0b\u53ef\u80fd\u4f1a\u88ab\u653e\u5230\u76f8\u540c\u7684 CPU Core \u6216\u8005\u76f8\u540c\u7684 NUMA \u8282\u70b9\u4e0a\u3002<\/p>\n<p>\u6b64\u7279\u6027\u5bf9\u4e2d\u65ad\u5524\u9192\u8fdb\u7a0b\u65f6\u4e5f\u8d77\u4f5c\u7528\uff0c\u5728\u4e0a\u4e00\u8282\u6240\u8ff0\u7684\u73b0\u8c61\u4e2d\uff0c\u6240\u6709\u7684\u7f51\u7edc\u4e2d\u65ad\u90fd\u5206\u914d\u7ed9 CPU 0 \u53bb\u5904\u7406\u3002<\/p>\n<p>\u5f53\u4e2d\u65ad\u5904\u7406\u5b8c\u6210\u65f6\uff0c\u7531\u4e8e wakeup affinity \u7279\u6027\u7684\u4f5c\u7528\uff0c\u6240\u5524\u9192\u7684\u7528\u6237\u8fdb\u7a0b\u4e5f\u88ab\u5b89\u6392\u7ed9 CPU 0 \u6216\u5176\u6240\u5728\u7684 NUMA \u8282\u70b9\u4e0a\u5176\u4ed6 Core\u3002<\/p>\n<p>\u800c\u5f53\u4e24\u4e2a NUMA Node \u5904\u7406\u4e2d\u65ad\u65f6\uff0c\u8fd9\u79cd\u8c03\u5ea6\u7279\u6027\u6709\u53ef\u80fd\u5bfc\u81f4 Redis \u8fdb\u7a0b\u5728 CPU Core \u4e4b\u95f4\u9891\u7e41\u8fc1\u79fb\uff0c\u9020\u6210\u6027\u80fd\u635f\u5931\u3002<\/p>\n<p>\u7efc\u5408\u4e0a\u8ff0\uff0c\u5c06\u4e2d\u65ad\u90fd\u5206\u914d\u5728\u540c\u4e00 NUMA Node \u4e2d\uff0c\u4e2d\u65ad\u5904\u7406\u51fd\u6570\u548c\u5e94\u7528\u7a0b\u5e8f\u5145\u5206\u5229\u7528\u540c NUMA \u4e0b\u7684 L2\u3001L3 \u7f13\u5b58\u3001\u4ee5\u53ca\u540c Node \u4e0b\u7684\u5185\u5b58\uff0c\u7ed3\u5408\u8c03\u5ea6\u7cfb\u7edf\u7684 wake affinity \u7279\u6027\uff0c\u80fd\u591f\u66f4\u8fdb\u4e00\u6b65\u964d\u4f4e\u5ef6\u8fdf\u3002<\/p>\n<\/p>\n<p>\u53c2\u8003\u6587\u6863\uff1a<\/p>\n<p>1\u3001Intel\u5b98\u65b9\u6587\u6863\uff1a<\/p>\n<p>https:\/\/communities.intel.com\/community\/tech\/wired\/blog\/2009\/11\/04\/how-the-kitchen-sink-and-statistics-explain-and-treat-dropped-packets<\/p>\n<p>2\u3001Red Hat\u5b98\u65b9\u6587\u6863\uff1a<\/p>\n<p>https:\/\/access.redhat.com\/sites\/default\/files\/attachments\/20150325_network_performance_tuning.pdf<\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u6587\u8be6\u89e3Redis\u5728\u4e07\u4ebf\u7ea7\u65e5\u8bbf\u95ee&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[101],"tags":[],"class_list":["post-201461","post","type-post","status-publish","format-standard","hentry","category-database"],"_links":{"self":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201461","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/comments?post=201461"}],"version-history":[{"count":0,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201461\/revisions"}],"wp:attachment":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/media?parent=201461"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/categories?post=201461"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/tags?post=201461"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}