Articles of linux kernel

交换使用时,kswapd经常使用100%的CPU

大多数时候,当我的电脑开始需要交换时,我看到CPU使用率大幅上升( kswapd0始终使用99%-100%的CPU)。 根据top ,时间花在sy (系统/内核)而不是wa (IO等待)。 我正在C720上运行Linux 4.0.4-2-ARCH,内存为2GB,固态硬盘为6GB。 我似乎有这个问题有或没有丢弃页面(TRIM)打开。 有什么设置我应该检查或调整,看看我能解决这个问题吗? 有什么方法可以debugging这个问题吗? 像内核线程strace东西? 使用默认的Arch Linux设置运行: /proc/sys/vm/swappiness = 60 /proc/sys/vm/vfs_cache_pressure = 100 /sys/kernel/mm/transparent_hugepage/enabled = [always] madvise never

Linux:echo 3> / proc / sys / vm / drop_caches需要几小时才能完成

我有一台色卡司N8900 NAS,它是基于Linux的文件服务器,通过NFS向六个客户端提供文件。 出于某些原因,Thecus支持尚未解释,它运行一个脚本,每60秒检查/ proc / meminfo,如果磁盘caching超过可用RAM的50%,他们做一个“echo 3> / proc / sys / vm / drop_caches “命令来刷新caching。 撇开是否合理的问题,实际的“echo 3> / proc / sys / vm / drop_caches”命令可能需要几个小时才能完成,这对我来说似乎太长了。 最大的问题是,当发生这种情况时,机器上的负载就会像磁盘利用率一样激增,从而使得所有的NFS通信都被抓取,直到命令最终完成,此时事情又会有所反应。 NAS本身有16个内存,7个raid6configuration的驱动器(加上热备份),根本没有驱动器问题(根据SMARTtesting)。 所以问题是:什么会导致drop_caches命令这么久?

Linux:使用性能调控器时为什么CPU频率会波动?

我正在使用Debian 8 amd64机器进行基准testing。 在实验过程中,我希望CPU以固定的频率(最好是最大可能)运行。 这将排除CPU时钟速度作为结果变化的来源。 经过一番阅读,似乎正确的做法是将CPU调速器更改为performance ,这在Linux内核文档中进行了描述: CPUfreq调节器“性能”将CPU静态设置为scaling_min_freq和scaling_max_freq边界内的最高频率。 令人遗憾的是,关于scaling_min_freq和scaling_max_freq更多细节未提供。 希望不要紧,因为所使用的CPU频率是间隔的最大值。 所以我使用cpufreq-set启用了这个调控器: $ cat / sys / devices / system / cpu / cpu * / cpufreq / scaling_governor 性能 性能 性能 性能 为了好的措施,我还禁用了BIOS中的增压模式: $ cat / sys / devices / system / cpu / intel_pstate / no_turbo 1 基于以上对性能调节器的描述,我预计CPU时钟速度没有波动。 但是如果我反复运行cpufreq-info ,我会发现时钟速度在波动: $ cpufreq-info | grep'当前CPU […]

在SMP系统上使用多队列网卡实现multithreading

数据包如何从networking接口队列调度到CPU,然后再转发到线程进行处理? 什么需要考虑到如何在队列,硬件中断vs softirqs,CPU /内存/应用程序/线程局部性,multithreading与多进程守护进程中散列数据包,以避免尽可能多的数据包重新计划/复制尽可能? 我有一个使用Linux 2.6.32(yes,old)的Debian amd64上运行16个本地线程的multithreadingnetworking守护进程(比如Unbound resolver),因此应用程序负载分布在16个CPU上。 网卡是bnx2(BCM5709S),支持8个MSI-X rx / tx队列。 每个队列的IRQ通过在/ proc / irq / n / smp_affinity中静态映射中断关联被分配给一个单独的CPU(irqbalance从来没有做好),队列哈希types(RSStypes)是默认的(src + dst ,TCP sport + dport),使用默认的散列键。 所有这些都有助于传播负载,但不是平均的:通常有一个应用程序线程执行两倍于其他线程的工作(=每秒请求数),一个CPU(可能是处理该特定线程的CPU)的softirq速率是其他线程的两倍的CPU。 CPU已经启用了超线程,但是我还没有做任何事情来传播负载到'真正'的核心(我真的应该)。 Linux提供了一个相当全面的networking缩放文档 ,但我错过了一些空白: 该文件说这关于RSSconfiguration: 如果设备支持足够的队列,则典型的RSSconfiguration将是每个CPU具有一个接收队列,否则对于每个存储器域至less一个接收队列,其中存储器域是共享特定存储器级别的一组CPU(L1,L2 ,NUMA节点等)。 问:如何确定我的服务器的CPU /caching/内存域configuration? 有关接收stream量转向(RFS)的信息似乎回答了一些关于将数据包传送到正确的CPU /线程的问题: RFS的目标是通过将数据包的内核处理引导到消耗数据包的应用程序线程正在运行的CPU来增加datacache hitrate。 问:在DNSparsing的情况下,通常有一个查询包和一个应答包。 使用multithreading守护进程,只有一个线程运行bind()+ recvfrom(),因此在将工作调度到其他线程之前,必须处理所有新的传入数据包? 这个特殊用例会从分叉操作中受益吗(每个CPU有一个进程)呢? 问:接收stream量转向后,通常最适用于multithreadingTCP守护进程? 问:你将如何确定是否进行multithreading或多进程操作? 显然有共享内存和数据结构,资源争夺等,但我在考虑包stream和应用程序监听器。 问:如果没有接收stream量转向或简单的UDP服务,数据包是否能到达“错误的”CPU,因此会被重新安排到“正确的”CPU? 这会触发一个NET_RX softirq? 问:NIC队列和CPU之间是否有NET_RX softirq? CPU和侦听线程/进程之间是否还有一个? 如果接收线程将数据包安排到工作线程,是否还有另外一个可能性? 太糟糕了,Ben Hutchings的netconf […]

与5.5版本相比,MySQL 5.5降低了Linux内核3.2的性能

我们的数据库服务器(主要基于Debian稳定软件包(当前为Wheezy))似乎在内核3.2.0-4-amd64的相同工作负载的情况下比在之前的2.6.32-5-amd64内核中的负载大约多4倍。如果所有的软件包都是相同的,并且在另一个内核中启动,我们可以清楚地看到它们之间的差异,而且我为什么会感到不知所措。问题是,我没有看到太多的IO或CPU负载差异。 将默认的kernel.sched_min_granularity_ns和kernel.sched_latency_ns设置回2.6.32值会有所帮助(三次加载而不是四次),但是不会达到我们想要的水平。 当很多内核设置发生变化时,我们几乎不能盲目地将新内核设置为2.6的旧内核值。 有没有其他人有这方面的经验? 如果是这样,是什么造成了这一点(理想的情况是:怎么解决的)? 由于它与内核深层有关,所以在sysctl值上的区别也许是有意义的: 这里是2的区别 (为了防止过长的问题,pastebinned)。 编辑 :目前我们正在调查这个答案 ,看看是否适用。

如何在Linux上实现每个数据包的多path路由?

Linux Kernel在3.6之前使用了路由caching来做IPv4多path路由,这意味着在两个单独的线路/ ISP之间的路由很容易。 algorithm从3.6改为每个包,这意味着需要一些路由表/规则/ iptables标记技巧来实现两条线/ ISP。 但是,如果您有两条具有相同ISP的线路,可以按平衡/故障转移方式将每条线路上的单个IP路由到每条线路上,那么从3.6开始,您可以轻松实现线路绑定(在IP级别)每个数据包在两个方向上的路由。 从4.4开始, 内核再次改变为基于源地址和目的地址的散列的基于stream量的负载平衡。 我目前正在运行内核4.4.36,并通过PPPoE连接使用多path路由。 我的来自ISP的下行stream量在每个数据包的基础上通过两条独立线路(一条IP路由到两条线路)。 这给我一个下载速度比一个单独的线速度更快。 几乎两条线的速度加起来。 它工作得很好,Skypevideo,VoIP(UDP),YouTube等都很好。 由于具有如此好的下行体验,我想尝试上行,但是我的上行stream量是根据跨ppp设备(具有相同IP地址)的较新的基于stream的algorithm来路由的。 这意味着我无法获得比单行速度更快的上传速度。 有没有一种方法来configuration当前的内核使用每个数据包algorithm? 还是其他一些方法来实现每个分组的多path路由? 我需要恢复到一个较旧的内核(我不想做其他各种原因)吗? 我的ISP不支持多链接ppp。 如果是相关的,我目前在Raspberry Pi 3上运行Arch Linux ARMv7。

如果Linuxcaching过大,为什么QEMU不能分配内存?

如果我使用我的机器[Ubuntu 16.04 64位,内核4.4]一段时间,QEMU需要内核caching丢弃,否则,它不会pipe理分配内存。 为什么会发生? 这是一个示例运行: ~$ free -m total used free shared buff/cache available Mem: 15050 5427 3690 56 5931 4803 Swap: 0 0 0 ~$ sudo qemu-system-x86_64 -m 10240 # and other options qemu-system-x86_64: cannot set up guest memory 'pc.ram': Cannot allocate memory ~$ echo 3 | sudo tee /proc/sys/vm/drop_caches 3 ~$ free -m […]

通过WAN禁用多播传送多播(到另一个LAN)

我的服务器和客户端软件在Linux上运行。 服务器广播多播,客户端侦听多播。 我的客户必须迁移到另一个站点, 不幸的是,在两个站点之间不允许组播🙁 如何在两个站点之间传递多播? – 通过TCP或UDP? – 你推荐什么工具? – 什么延迟? 我收到了关于思科configuration(GRE)的一个很好的答案, 但其中一个networking团队不想监视/维护它, =>当传输将中断时,支持团队将花费太多时间来理解和修复。 =>那么,什么应该是GRE的最佳select? 有没有一个基于Linux内核function的解决scheme 或网卡function? (低延迟很重要) 用法示例赞赏:-) 当前:服务器和客户端在同一个站点上 目前的networking图http://ditaa.org/ditaa/render?grid=%2B%-%2B+%2B%-%2B%0D%0A%7C+服务器++%7C +%7C +客户端++%7C%0D%0A%7C +发送+++%7C +%7C +侦听+%7C%0D%0A%7Cmulticast%7C +%7Cmulticast%7C%0D%0A%7C +++ IP1 +++%7C +%图7C ++ ++++ IP2%7C%0D 0A%%2B —-%2B —-%2B +%2B —%2B —–%2B%0D 0A%+++++%7C ++++++++++%7C%0D 0A%+++++ %2B%2B ———%2B%0D 0A%++++++%7CLAN +网站+ + 1%0D 0A%++++++%7C%0D 0A%++++++%2B ———– ———- WAN 未来:服务器和客户端,每一个在不同的网站上 […]

net.core.rmem_max和net.ipv4.tcp_rmem之间的差异

net.core.rmem_max和net.ipv4.tcp_rmem的第三个值有什么区别? 哪个具有较高的TCP连接优先级? 对于以下两个示例,tcp连接的最大缓冲区是多less? Case 1: sysctl -w net.core.rmem_max=7388608 sysctl -w net.ipv4.tcp_rmem='4096 87380 8388608' Case 2: sysctl -w net.core.rmem_max=8388608 sysctl -w net.ipv4.tcp_rmem='4096 87380 7388608'

如何在CentOS中为所有现有和未来的内核设置默认内核参数?

我想删除内核在CentOS 6中启动时默认使用的rhgb和quiet内核参数,但是我希望它适用于所有当前安装的内核以及将来安装的任何内核。 我需要从脚本执行此操作,因此手动编辑文件不是一个选项,任何文件更改都应尽可能干净地完成。 在Debian / Ubuntu中,我将更改/etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT ,然后运行update-grub 。 我在/etc/sysconfig/grub或/etc/sysconfig/kernel中找不到这样的设置,但是也没有update-grub脚本。