背景

前段时间在测试docker的网络性能的时候,发现了一个veth的性能问题,后来给docker官方提交了一个PR,参考set tx_queuelen to 0 when create veth device,引起了一些讨论。再后来,RedHat的网络专家Jesper Brouer 出来详细的讨论了一下这个问题。

可以看到,veth设备qdisc队列,而环回设备/桥接设备是没qdisc队列的,参考br_dev_setup函数。

内核实现

在注册(创建)设备时,qdisc设置为noop_qdisc, register_netdevice -> dev_init_scheduler

void dev_init_scheduler(struct net_device *dev)
{dev->qdisc = &noop_qdisc;netdev_for_each_tx_queue(dev, dev_init_scheduler_queue, &noop_qdisc);dev_init_scheduler_queue(dev, &dev->rx_queue, &noop_qdisc);setup_timer(&dev->watchdog_timer, dev_watchdog, (unsigned long)dev);
}

打开设备时,如果没有配置qdisc时,就指定为默认的pfifo_fast队列: dev_open -> dev_activate,

void dev_activate(struct net_device *dev)
{int need_watchdog;/* No queueing discipline is attached to device;create default one i.e. pfifo_fast for devices,which need queueing and noqueue_qdisc forvirtual interfaces*/if (dev->qdisc == &noop_qdisc)attach_default_qdiscs(dev);
...
}static void attach_default_qdiscs(struct net_device *dev)
{struct netdev_queue *txq;struct Qdisc *qdisc;txq = netdev_get_tx_queue(dev, 0);if (!netif_is_multiqueue(dev) || dev->tx_queue_len == 0) {netdev_for_each_tx_queue(dev, attach_one_default_qdisc, NULL);dev->qdisc = txq->qdisc_sleeping;atomic_inc(&dev->qdisc->refcnt);} else {///multi queueqdisc = qdisc_create_dflt(dev, txq, &mq_qdisc_ops, TC_H_ROOT);if (qdisc) {qdisc->ops->attach(qdisc);dev->qdisc = qdisc;}}
}static void attach_one_default_qdisc(struct net_device *dev,struct netdev_queue *dev_queue,void *_unused)
{struct Qdisc *qdisc;if (dev->tx_queue_len) {qdisc = qdisc_create_dflt(dev, dev_queue,&pfifo_fast_ops, TC_H_ROOT);if (!qdisc) {printk(KERN_INFO "%s: activation failed\n", dev->name);return;}/* Can by-pass the queue discipline for default qdisc */qdisc->flags |= TCQ_F_CAN_BYPASS;} else {qdisc =  &noqueue_qdisc;}dev_queue->qdisc_sleeping = qdisc;
}

创建noqueue

开始尝试直接删除设备默认的pfifo_fast队列,发现会出错:

# tc qdisc del dev vethd4ea root
RTNETLINK answers: No such file or directory
# tc  -s qdisc ls dev vethd4ea
qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1Sent 29705382 bytes 441562 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0

后来看到Jesper Brouer给出一个替换默认队列的方式,尝试了一下,成功完成。

替换默认的qdisc队列

# tc qdisc replace dev vethd4ea root pfifo limit 100
# tc  -s qdisc ls dev vethd4ea
qdisc pfifo 8001: root refcnt 2 limit 100pSent 264 bytes 4 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0
# ip link show vethd4ea
9: vethd4ea: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo master docker0 state UP mode DEFAULT qlen 1000
link/ether 3a:15:3b:e1:d7:6d brd ff:ff:ff:ff:ff:ff

修改队列长度

# ifconfig vethd4ea txqueuelen 0

删除qdisc

# tc qdisc del dev vethd4ea root
# ip link show vethd4ea
9: vethd4ea: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT
link/ether 3a:15:3b:e1:d7:6d brd ff:ff:ff:ff:ff:ff

可以看到,UP的veth设备成功修改成noqueue。

本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/p/4105884.html,如需转载请自行联系原作者

从veth看虚拟网络设备的qdisc相关推荐

  1. Linux 虚拟网络设备 tun/tap veth pair

    Linux 虚拟网络设备 tun/tap veth pair 本篇主要介绍一下 linux 下面的 虚拟网络设备 tun/tap veth pair 随着容器逐步取代虚拟机,成为云基础架构的标准,然而 ...

  2. Linux 虚拟网络设备

    一.tun/tap(虚拟网卡) TUN/TAP设备浅析(一) – 原理浅析 - 简书 (jianshu.com) (3条消息) Linux-虚拟网络设备-tun/tap_sld880311的专栏-CS ...

  3. linux虚拟网络设备之veth(二)

    有了上一篇关于tun/tap的介绍之后,大家应该对虚拟网络设备有了一定的了解,本篇将接着介绍另一种虚拟网络设备veth. veth设备的特点 veth和其它的网络设备都一样,一端连接的是内核协议栈. ...

  4. Linux - 虚拟网络设备 - bridge,veth,namespace

    引用 轻松理解 Docker 网络虚拟化基础之网络 namespace! 轻松理解 Docker 网络虚拟化基础之 veth 设备! 深入理解 Linux 上软件实现的"交换机" ...

  5. 网络设备中的linux,理解linux虚拟网络设备veth

    原标题:理解linux虚拟网络设备veth 前面介绍了linux network namespace,接着介绍一下如何让一个独立的网络命名空间和主机的网络互通,这里我们需要用到linux虚拟网络设备v ...

  6. linux虚拟网络设备之bridge(桥)(三)

    继前两篇介绍了tun/tap和veth之后,本篇将介绍Linux下常用的一种虚拟网络设备,那就是bridge(桥). 本篇将通过实际的例子来一步一步解释bridge是如何工作的. 什么是bridge? ...

  7. 云计算底层技术-虚拟网络设备(Bridge,VLAN)

    openstack底层技术-各种虚拟网络设备一(Bridge,VLAN)  openstack底层技术-各种虚拟网络设备二(tun/tap,veth) Linux Bridge Bridge与netf ...

  8. linux 虚拟网络设备详解(四)

    Linux 抽象网络设备简介 和磁盘设备类似,Linux 用户想要使用网络功能,不能通过直接操作硬件完成,而需要直接或间接的操作一个 Linux 为我们抽象出来的设备,既通用的 Linux 网络设备来 ...

  9. linux虚拟网络设备之tun/tap(一)

    在现在的云时代,到处都是虚拟机和容器,它们背后的网络管理都离不开虚拟网络设备,所以了解虚拟网络设备有利于我们更好的理解云时代的网络结构.从本篇开始,将介绍Linux下的虚拟网络设备. 虚拟设备和物理设 ...

最新文章

  1. 在.NET环境下发送邮件
  2. java 商城 jfinal,Jfinal开发农副产品电子商城系统,完整前后台系统
  3. Redis实现广告缓存、并完善缓存击穿
  4. java做的模板商城_不吹不黑4个超火Java开源项目,接私活、练手、必备项目
  5. 刷新SqlServer所有视图【存储过程】
  6. java mvc引擎_Velocity是一种Java模版引擎技术,MVC架构的一种实现,但它更多的是关注在Model和View之间,作为它们的桥梁。服务端渲染,我们使用最多的就是用他...
  7. MassTransit Get Started-
  8. java捕捉了异常_java 异常捕获与异常处理
  9. 访问修饰符,封装,继承
  10. 《Java并发编程实践》读书笔记
  11. layUI表单验证不生效的问题
  12. Android 模拟机键盘不可用的问题 !!
  13. 建立ssh隧道_快速掌握 SSH 端口转发,助力远程工作
  14. JS获取浏览器滚动条的宽度
  15. c++11支持类数据成员的初始化
  16. python random设置种子_关于python:如何查询random.random()使用的种子?
  17. 电脑计算机人员英语,计算机专业英语词汇新大全(完美打印版).pdf
  18. php mysql免安装版_资源共享:免安装版nginx+php+mysql+phpmyadmin+memcache开发环境包
  19. 鹿晗关晓彤公开恋情,是如何把微博服务器搞炸的? 鹿晗关晓彤公开恋情,是如何把微博服务器搞炸的? 题图:《盗墓笔记》 鹿晗关晓彤公开恋情,是如何把新浪微博的服务器搞垮的? 知友:苏莉安(200+
  20. docker 强制使用root进入容器

热门文章

  1. MySQL字段类型解析
  2. 计算机工程与应用 网站,计算机工程与应用杂志
  3. 服务器是多用户服务的计算机,Win10权限管理与多用户远程登录(多方案)
  4. Java verts_Java-JOGL绘制VBO黑屏
  5. mysql 海量数据库的查询优化及分页算法方案_mysql 海量数据库的查询优化及分页算法方案...
  6. 关于Zipkin的几个问题
  7. MapReduce之WordCount案例
  8. 大数据计算服务MaxCompute行业开发应用案例
  9. Vue项目中使用基于pdf.js的vue-pdf插件在pc浏览器下阅览PDF文件
  10. 勒索病毒恐难暴力破解 国内比特币平台尚买币潮