首页 > *nix技术, Shell命令, 系统管理 > dropped与overruns的区别

dropped与overruns的区别

2012年2月8日 发表评论 阅读评论 24,499 次浏览

在使用ifconfig命令查看网卡信息时,对于收发包的统计里有dropped与overruns两个字段,看上去都是丢包,但它们有什么区别呢?

[root@localhost ~]# ifconfig eth3
eth3      Link encap:Ethernet  HWaddr 00:0C:29:45:2E:8B  
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe45:2e8b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:129430 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2255 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:9978636 (9.5 MiB)  TX bytes:320765 (313.2 KiB)

[root@localhost ~]# 

网址:http://www.faqs.org/docs/linux_network/x-087-2-iface.ifconfig.html给的解释是:how many packets were dropped (probably because of low memory), and how many were lost because of an overrun. Receiver overruns usually occur when packets come in faster than the kernel can service the last interrupt.
具体解释如下(我的个人理解,不一定对):
dropped,表示这个数据包已经进入到网卡的接收缓存fifo队列,并且开始被系统中断处理准备进行数据包拷贝(从网卡缓存fifo队列拷贝到系统内存),但由于此时的系统原因(比如内存不够等)导致这个数据包被丢掉,即这个数据包被Linux系统丢掉。
overruns,表示这个数据包还没有被进入到网卡的接收缓存fifo队列就被丢掉,因此此时网卡的fifo是满的。为什么fifo会是满的?因为系统繁忙,来不及响应网卡中断,导致网卡里的数据包没有及时的拷贝到系统内存,fifo是满的就导致后面的数据包进不来,即这个数据包被网卡硬件丢掉。所以,个人觉得遇到overruns非0,需要检测cpu负载与cpu中断情况。
ifconfig读的是/proc/net/dev接口,在源文件net-tools-1.60\lib\interface.c的if_readlist_proc函数内可以看到;而/proc/net/dev接口导出的数据是通过函数dev_seq_show以及dev_seq_printf_stats来的,这两个函数都在\linux\2.6.38.8.x86\net\core\dev.c文件内,其中:
dropped对应的是stats->rx_dropped + stats->rx_missed_errors,
overruns对应的是stats->rx_fifo_errors。

/* The main device statistics structure */
struct rtnl_link_stats64 {
	__u64	rx_packets;		/* total packets received	*/
	__u64	tx_packets;		/* total packets transmitted	*/
	__u64	rx_bytes;		/* total bytes received 	*/
	__u64	tx_bytes;		/* total bytes transmitted	*/
	__u64	rx_errors;		/* bad packets received		*/
	__u64	tx_errors;		/* packet transmit problems	*/
	__u64	rx_dropped;		/* no space in linux buffers	*/
	__u64	tx_dropped;		/* no space available in linux	*/
	__u64	multicast;		/* multicast packets received	*/
	__u64	collisions;

	/* detailed rx_errors: */
	__u64	rx_length_errors;
	__u64	rx_over_errors;		/* receiver ring buff overflow	*/
	__u64	rx_crc_errors;		/* recved pkt with crc error	*/
	__u64	rx_frame_errors;	/* recv'd frame alignment error */
	__u64	rx_fifo_errors;		/* recv'r fifo overrun		*/
	__u64	rx_missed_errors;	/* receiver missed packet	*/

	/* detailed tx_errors */
	__u64	tx_aborted_errors;
	__u64	tx_carrier_errors;
	__u64	tx_fifo_errors;
	__u64	tx_heartbeat_errors;
	__u64	tx_window_errors;

	/* for cslip etc */
	__u64	rx_compressed;
	__u64	tx_compressed;
};

转载请保留地址:http://www.lenky.info/archives/2012/02/1028http://lenky.info/?p=1028


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

  1. 肚腩照明月
    2013年12月26日11:51 | #1

    and how many were lost because of an overrun. Receiver overruns usually occur when packets come in faster than the kernel can service the last interrupt.

    这个我的理解是:
    非 NAPI 网卡会存在这种问题。
    应该是说数据包发过来的速度快过内核的处理速度。所以丢弃了。 /proc/sys/net/core/netdev_max_backlog 这个参数可以改善这种情况。

  2. lenky
    2012年10月22日14:14 | #2

    @rain_at_dna
    上文说的也只是我根据代码来看得到的结论,不一定对,而问题又随具体情况而不同,如果你对内核了解基本情况的话,建议直接查一下内核代码。

  3. rain_at_dna
    2012年10月22日05:48 | #3

    overruns 与 内核参数 rp_filter 会有关系吗?还是说overruns 是纯内核问题?亦或硬件问题?

  1. 本文目前尚无任何 trackbacks 和 pingbacks.