Articles of linux kernel

netmap问题与wheezy Linux内核3.2.0.4和英特尔公司82599EB万兆卡

我已经编译debian wheezy netmap驱动程序与内核3.2.0.4和ixgbe从netmap驱动程序代码修补模块。 当我删除默认的ixgbe模块后插入模块,我得到以下输出。 [64228.332381] 175.533442 netmap_new_obj_allocator [426] objsize 1024 clustsize 4096 objects 4 [64228.332564] 175.533627 netmap_new_obj_allocator [504] Pre-allocated 128 clusters (4/512KB) for 'netmap_if' [64228.332641] 175.533704 netmap_new_obj_allocator [426] objsize 36864 clustsize 36864 objects 1 [64228.335246] 175.536308 netmap_new_obj_allocator [504] Pre-allocated 200 clusters (36/7200KB) for 'netmap_ring' [64228.335319] 175.536383 netmap_new_obj_allocator [426] objsize 2048 clustsize 4096 objects 2 [64228.392241] […]

我应该为数据中心内的路由设置rto_min吗?

我们有一个专门的服务器租用在一个数据中心与Debian 7,内核3.2。 我们使用其中一台服务器作为数据库服务器。 我们的应用程序服务器和数据库服务器之间的networking不是专用于我们的,而是由数据中心的其他客户使用的。 我们时常会认识到这条线上的TCP重传。 我们认为这是由于拥塞或ddos攻击。 我们的提供商试图防止攻击,但当然并不总是成功。 无论如何。 通常,我们的应用程序服务器在20毫秒内从数据库获取结果,因为数据库服务器速度非常快,往返时间(RTT)平均值为0.3毫秒(因此小于1毫秒)。 当一个TCP数据包在这一行中丢失时,重传超时(RTO)将会启动。它由往返时间计算,但至less为200ms。 所以当一个数据包需要重新传输时,我们有220毫秒的时间才能让我们的应用服务器获取数据,这只是因为RTO。 对我来说rto_min = 200ms似乎是在1ms以内rtt链接的高点。 可以像这样使用ip来设置rto_min: ip route change default via 144.76.176.65 dev eth0 rto_min 5ms RTO仍然可以计算,但是由于我们的RTT非常小,可能会降到5毫秒。 我应该考虑这个还是有其他的TCP陷阱我会陷入rto_min设置这么小? rto_min的合理价值是什么?还是最好不要碰它?

__ticket_spinlock高cpu

在我们的Ubuntu 10.04 KVM基础设施上,我们遇到了一个奇怪的问题,即使我们重新启动应用程序,周期性地,两个vm web服务器中的一个出现负载持续很高的情况。 (在vm中使用任何重要的系统资源的唯一方法)如果我们完全停止了webserver守护进程,负载确实会下降,但是当我们重新启动时,负载会跳回到高水平。 vm guest虚拟机的重新启动清除了问题,在问题返回之前它可以正常运行好几天。 最近,我们在pipe理程序上安装了“perf”,并注意到在高负载期间,内核函数“__ticket_spinlock”使用CPU的比例很高(30-60%),而在正常操作期间低于1%。 高负载的虚拟机重新启动清除了这一点。 做一些研究,了解自旋锁和自旋锁,我们已经提出了一个假设,即经历高负载的虚拟机正在等待其他虚拟机持有的锁,并且由于某种原因没有得到它。 我们发现有这个问题的pipe理程序与之前部署的CentOS有不同之处,但是没有这样做。 Ubuntu 10.04虚拟机pipe理程序的内核使用不同的默认IOScheduler(截止date)进行编译,并且preempt_voluntary处于closures状态。 我们已经在两个站点之间同步了这些configuration,并且正在等待更新后的pipe理程序上的虚拟机是否再次出现exception。 **编辑:我们从来没有find根本原因,但自迁移到Ubuntu 14.04以来,我们再也没有看到这个问题。 有什么办法可以检测Linux进程正在等待什么设备,当它在自旋锁/自旋锁中? 有什么办法可以检测到Linux进程在特定设备上有锁吗?

“诺西邻居”和CFQ调度

我想了解如何使用CFQ影响“讨厌的邻居”问题。 我会问这个问题,使用CFQ的时候,是否还会有一个“好邻居”? 是不是CFQ应该确保所有进程(VM)获得公平的存储时间片? 如果是这样,当CFQ被使用时,一个VM I / O如何干扰另一个VM I / O? 环境是CentOS6.5 + OpenStack + KVM + Ceph

在IRQ合并之前,NAPI有哪些优势?

众所周知,有两种方法可以避免在高负载networking中出现硬件中断的一些开销,当硬件中断太多时,切换到它们需要很多时间。 程序风格的performance和select方法是非常重要的。 NAPI与自适应中断 NAPI(新API) – 不使用硬件中断 ,每隔一段时间轮询以太网设备。 Linux内核默认使用中断驱动模式,当进入的数据包stream量超过一定的阈值时,只能切换到轮询模式。 http://en.wikipedia.org/wiki/New_API内核可以定期检查传入networking数据包的到达而不中断 ,从而消除了中断处理的开销。 中断合并 – 使用硬件中断 ,但是如果发生中断,则禁止中断并在一段时间内开始轮询 ,之后轮询终止并且中断被激活。 https://en.wikipedia.org/wiki/Interrupt_coalescing一种技术,其中通常会触发硬件中断的事件被阻止 , 直到一定数量的工作挂起,或超时计时器触发。 两种方法都没有明显的中断成本 – 这对于默认的中断驱动模式是有利的。 但是第二种方法 – 中断合并更合理,因为它: 延迟较小 – 一旦包到达,立即尝试立即处理中断,或在最近发生中断时轮询。 对面的NAPI将不会立即处理该帧,而是会等待下一轮的一定时间。 较less的CPU使用率 – 仅在至less有一个数据包已经到达的情况下才开始轮询。 但是,即使帧没有收到,也不是徒劳地进行民意调查,就像做了NAPI一样。 在IRQ合并之前,NAPI有哪些优势?

在Debian服务器上的CPU上检测到自我检测失速

我的服务器自2014年10月起在线。 Debian GNU/Linux 7.6 uname -r 3.10.23-xxxx-std-ipv6-64 直到昨天晚上,它工作得很好。 昨晚它不负责任。 我从dadata中心控制面板重新启动它,结束everythin是确定的。 今天晚上,它在不同的时间再次冻结。 我没有安装任何新的软件,只是定期更新。 服务器日志文件显示:rcu_sched在CPU上自检失速 有任何想法吗? Mar 4 01:51:01 server4 kernel: INFO: rcu_sched self-detected stall on CPU { 6} (t=15001 jiffies g=78281006 c=78281005 q=5678) Mar 4 01:51:01 server4 kernel: sending NMI to all CPUs: Mar 4 01:51:01 server4 kernel: NMI backtrace for cpu 6 Mar 4 01:51:01 […]

strace没有显示任何线程在100%'系统'的CPU

我很难与我的Python应用程序跨多个线程100%的“系统”CPU时间达10秒以上。 我(有限)的理解是'系统'CPU时间是花在内核上的时间。 strace显示正在进行的内核调用和(可选)多久。 在这些暂停之一中,我设法在一个线程上运行strace,但是strace输出在那段时间内只有一个缺口,而且在这个缺口的任何一边都会显示很短的时间。 如何正确运行strace来找出发生什么内核调用? 在我的Python应用程序中,我使用单独的线程和psutil来检查高系统CPU的任何线程,然后将其注销。 一旦我看到一个我使用下面的命令行来启动strace: strace -tT -o ~/strace.log -p <PID of thread> 从我的应用程序中logging(使用psutil下的psutil ): 2015-05-19 08:05:47,025 WARNING:log.cpu Logging paused for 0.34s to 08:05:46.985768 – longer than expected – other threads probably delayed as well 2015-05-19 08:05:47,026 WARNING:log.cpu This process utilization (CPUs) user: 0.1, system: 52.4 | OS (%) scputimes(user=0.4, nice=0.0, system=80.2, idle=19.3, […]

如何在系统崩溃的情况下可靠捕获Linux内核日志消息(BUG,panic)?

我希望能够访问线程/回溯/在死亡之前由内核窃听的内容。 这已被certificate是有问题的,因为我有权访问的所有接口都被禁用。 在重新启动后,systemd日志还没有能够logging有关崩溃的任何信息,可能是因为缓冲区冲洗到文件系统被阻止。 这是我尝试过的并且失败了 控制台访问 – X应用程序在这里运行dayjob,但系统崩溃后,没有键盘input被识别,所以我不能切换到vt netconsole发送数据到nc在另一台机器上侦听 – 我期望这个工作,但一切显示,没有崩溃相关的内核回溯到那里,甚至没有与dmesg -n 8 通过networkingssh – 崩溃后不可能,因为networking也被阻止 还有什么其他的select,我必须捕获100%的一切? 也许串口控制台? (什么将是一个合适的设备)我认为任何与USB的东西都易于也阻止子系统。 注意 :这个盒子是本地的,坐在我的房间里,所以所有的访问和方法都可用。

内核崩溃 – 内核:BUG:无法在00000000ff8179b9处理内核分页请求

我的一个运行Oracle ASM / GRID的Oracle Linux 6.5服务器遇到内核崩溃,它没有响应我执行了硬重启。 服务器是Oracle Linux 6.5,内核2.6.39-400.214.3.el6uek.x86_64,32GB内存,35GB交换,硬件方面也没有警告。 / var / log / messages上的日志: Apr 19 08:22:14 srvx-prod kernel: [Hardware Error]: Machine check events logged Apr 19 08:22:14 srvx-prod kernel: BUG: unable to handle kernel paging request at 00000000ff8179b9 Apr 19 08:22:14 srvx-prod kernel: IP: [<ffffffff8105adc1>] task_rq_lock+0x61/0xb0 Apr 19 08:22:14 srvx-prod kernel: PGD 8020af067 […]

IPv6等价于Linux内核的多path路由工作吗?

最终目标是通过在lo接口上设置多个具有相同/ 128的服务器来获得每个分组的ipv6 udp负载均衡。 首先,试图让它与静态路由一起工作,然后开始使用Quagga或类似的软件包来探索BGP。 这必须在100%的虚拟环境中完成。 从我的search看,发行说明看起来像是在Linux Kernel 3.6中添加的。 但是我还没有能够设置这个function的成功演示。 使用ip命令,我应该可以添加多个路由到相同的IPv6子网,权重相同。 例如: ip -6 route add badd:badd:badd:1::1/128 nexthop via badd:badd:badd:2::1 nexthop via badd:badd:badd:2::2 我的服务器连接到badd:badd:badd:2 :: / 64并且可以同时达到badd:badd:badd:2 :: 1和badd:badd:badd:2 :: 2。 其他两个服务器在lo界面上都有badd:badd:1 :: 1/128。 我每次看到的情况是数据包只能通过路由表中的最后一个条目路由。 如果我用IPv4复制这个设置,我看到数据包路由通过表中的两个条目切换每隔一个数据包。 我已经尝试了多个内核3.10,4.4,4.6,但每个都收到了相同的结果。 我做错了什么,还是不支持? 谢谢!