标签: kernel

找出哪个任务在 linux 上产生了大量的上下文切换

根据 vmstat,我的 Linux 服务器(2xCore2 Duo 2.5 GHz)每秒持续进行大约 20k 次上下文切换。

# vmstat 3
procs -----------memory----------  ---swap-- -----io----  -system-- ----cpu----
 r  b   swpd   free   buff  cache    si   so    bi    bo   in    cs us sy id wa
 2  0   7292 249472  82340 2291972    0    0     0     0    0     0  7 13 79  0
 0  0   7292 251808  82344 2291968    0    0     0   184   24 20090  1  1 99  0
 0  0   7292 251876  82344 2291968    0    0     0    83   17 20157  1  0 …
Run Code Online (Sandbox Code Playgroud)

performance-monitoring kernel performance-tuning vmstat context-switch

13
推荐指数
2
解决办法
5万
查看次数

CPU 亲和性如何与 Linux 中的 cgroup 交互?

我正在尝试在一组独立的 CPU 上运行多线程基准测试。长话短说,我最初尝试使用isolcpustaskset,但遇到了问题。现在我在玩 cgroups/csets。

我认为“简单”cset shield用例应该可以很好地工作。我有 4 个内核,所以我想使用内核 1-3 进行基准测试(我还将这些内核配置为处于自适应滴答模式),然后内核 0 可用于其他所有内容。

按照这里的教程,它应该很简单:

$ sudo cset shield -c 1-3
cset: --> shielding modified with:
cset: "system" cpuset of CPUSPEC(0) with 105 tasks running
cset: "user" cpuset of CPUSPEC(1-3) with 0 tasks running
Run Code Online (Sandbox Code Playgroud)

所以现在我们有一个隔离的“盾牌”(用户 cset),核心 0 用于其他一切(系统 cset)。

好的,目前看起来不错。现在让我们来看看htop。这些进程应该都已迁移到 CPU 0 上:

csets

嗯?一些进程显示为在屏蔽内核上运行。为了排除 htop 存在错误的情况,我还尝试使用taskset检查显示为在屏蔽中的进程的亲和掩码。

也许那些任务是不可移动的?让我们选择一个显示为在 CPU3 上运行的任意进程(应该在屏蔽中)htop,看看它是否出现在系统 cgroup 中,根据cset

$ cset shield …
Run Code Online (Sandbox Code Playgroud)

linux kernel multi-core cgroup

13
推荐指数
1
解决办法
5204
查看次数

在一个接口上禁用 rp_filter

我有一个 Ubuntu 16.04 服务器,它充当具有多个(VLAN)接口的路由器。默认情况下,rp_filter对所有接口启用(反向路径过滤)。我想保持这种方式,但只有一个接口例外。(应该允许来自该接口的数据包具有不对应于该接口的任何路由目的地址的源 IP 地址。)

假设这个接口有 name ens20.4,它的 vlan-raw-device 是ens20,并且目标接口(用于测试数据包流)被命名ens20.2(尽管它应该适用于任何目标接口)。

我试图只设置rp_filter属性ens20.4,但没有成功:

echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter
Run Code Online (Sandbox Code Playgroud)

因此,出于测试目的,我还禁用rp_filter了 vlan-raw-device 和测试目标接口:

echo 0 > /proc/sys/net/ipv4/conf/ens20/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens20.2/rp_filter
Run Code Online (Sandbox Code Playgroud)

仍然没有成功,带有“欺骗”源 IP 地址的数据包仍然被丢弃。只有当我关闭rp_filter所有的接口,数据包打通:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
Run Code Online (Sandbox Code Playgroud)

但是,我仍然希望为所有其他接口保留反向路径过滤 - 我错过了什么?

linux routing kernel filtering ubuntu-16.04

13
推荐指数
1
解决办法
3万
查看次数

我可以在调用“apt-get purge”后删除/lib/modules/中的文件夹吗

我已经打电话apt-get purge卸载旧内核了。但是在清除过程中发生了一些错误,导致文件夹被遗留下来。它说该文件夹不是空的,因此无法删除。为了释放磁盘空间,我可以手动删除那些已清除的文件夹吗?

1.1M    ./4.15.0-20-generic
60M     ./4.15.0-32-generic <-- I've purged this
60M     ./4.15.0-30-generic <-- and this
236M    ./4.15.0-33-generic <-- this is my current one
Run Code Online (Sandbox Code Playgroud)

我也可以删除其中一些包吗?

un  linux-headers-4.15.0-20-generic                       <none>                          <none>                          (no description available)
ii  linux-headers-4.15.0-30                               4.15.0-30.32                    all                             Header files related to Linux kernel version 4.15.0
ii  linux-headers-4.15.0-30-generic                       4.15.0-30.32                    amd64                           Linux kernel headers for version 4.15.0 on 64 bit x86 SMP
ii  linux-headers-4.15.0-32                               4.15.0-32.35                    all                             Header files related to Linux kernel version 4.15.0
ii  linux-headers-4.15.0-32-generic                       4.15.0-32.35                    amd64                           Linux kernel headers for …
Run Code Online (Sandbox Code Playgroud)

ubuntu kernel

13
推荐指数
1
解决办法
7319
查看次数

如何在 Linux 中检查 *.ko 内核模块的版本?

我知道你可以这样做:

sudo modprobe -v some_module
Run Code Online (Sandbox Code Playgroud)

检查 的版本/lib/modules/.../some_module.ko,但我仍然希望能够检查不一定要由modprobe.

linux kernel

12
推荐指数
1
解决办法
3万
查看次数

奇怪:为什么linux在上次ping回复后用ARP请求响应ping?

我(和一位同事)刚刚注意到并测试过,当一台 Linux 机器被 ping 时,在最后一次 ping 之后,它会向启动 ICMP ping 的机器发起单播ARP 请求。ping Windows 机器时,Windows 机器最后不会发出 ARP 请求。

有谁知道这个单播 ARP 请求的目的是什么,为什么它发生在 Linux 而不是 Windows?

Wireshark 跟踪(10.20.30.45 是一个 Linux 机器):

No.Time        Source           Destination      Prot  Info
19 10.905277   10.20.30.14      10.20.30.45      ICMP  Echo (ping) request
20 10.905339   10.20.30.45      10.20.30.14      ICMP  Echo (ping) reply
21 11.904141   10.20.30.14      10.20.30.45      ICMP  Echo (ping) request
22 11.904173   10.20.30.45      10.20.30.14      ICMP  Echo (ping) reply
23 12.904104   10.20.30.14      10.20.30.45      ICMP  Echo (ping) request
24 12.904137   10.20.30.45      10.20.30.14      ICMP  Echo …
Run Code Online (Sandbox Code Playgroud)

linux arp kernel ping icmp

12
推荐指数
1
解决办法
6027
查看次数

如何设置 shmall、shmmax、shmmin 等...一般和 postgresql

我已经使用PostgreSQL文档来设置它,例如这个配置:

>>> cat /proc/meminfo 
MemTotal:       16345480 kB
MemFree:         1770128 kB
Buffers:          382184 kB
Cached:         10432632 kB
SwapCached:            0 kB
Active:          9228324 kB
Inactive:        4621264 kB
Active(anon):    7019996 kB
Inactive(anon):   548528 kB
Active(file):    2208328 kB
Inactive(file):  4072736 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:              3432 kB
Writeback:             0 kB
AnonPages:       3034588 kB
Mapped:          4243720 kB
Shmem:           4533752 kB
Slab:             481728 kB
SReclaimable:     440712 kB
SUnreclaim:        41016 kB
KernelStack:        1776 kB …
Run Code Online (Sandbox Code Playgroud)

postgresql linux performance kernel shmmax

12
推荐指数
1
解决办法
9万
查看次数

如何删除 CentOS 6 上的旧内核(以释放引导分区)?

如何确定要删除哪些内核以释放/boot分区上的一些空间。

这是一个场景(一些背景信息)。

1. Parititon 信息(如果有帮助)

# df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sda1        99M   81M   14M  86% /boot
...
Run Code Online (Sandbox Code Playgroud)

2. 当前内核版本

# uname -a
Linux serv.example.com 2.6.32-358.23.2.el6.x86_64 #1 SMP Wed Oct 16 18:37:12 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

3. 安装所有内核版本

# rpm -qa | grep kernel
abrt-addon-kerneloops-2.0.8-21.el6.centos.x86_64
kernel-firmware-2.6.32-431.1.2.0.1.el6.noarch
libreport-plugin-kerneloops-2.0.9-19.el6.centos.x86_64
kernel-headers-2.6.32-431.1.2.0.1.el6.x86_64
kernel-2.6.32-358.11.1.el6.x86_64
kernel-2.6.32-358.el6.x86_64
kernel-2.6.32-358.23.2.el6.x86_64
dracut-kernel-004-336.el6_5.2.noarch
Run Code Online (Sandbox Code Playgroud)

所以...

  1. 从上面的列表中删除哪些内核版本?
  2. 如何?
  3. 关于决定(为什么?)的简短解释会有所帮助。

partition centos kernel boot centos6

12
推荐指数
1
解决办法
2万
查看次数

为什么处于 FIN_WAIT2 状态的连接不被 Linux 内核关闭?

我有一个叫长寿命过程中的问题KUBE-代理的存在部分Kubernetes

问题是有时连接会处于 FIN_WAIT2 状态。

$ sudo netstat -tpn | grep FIN_WAIT2
tcp6       0      0 10.244.0.1:33132        10.244.0.35:48936       FIN_WAIT2   14125/kube-proxy
tcp6       0      0 10.244.0.1:48340        10.244.0.35:56339       FIN_WAIT2   14125/kube-proxy
tcp6       0      0 10.244.0.1:52619        10.244.0.35:57859       FIN_WAIT2   14125/kube-proxy
tcp6       0      0 10.244.0.1:33132        10.244.0.50:36466       FIN_WAIT2   14125/kube-proxy
Run Code Online (Sandbox Code Playgroud)

这些连接会随着时间的推移而堆积,从而使过程行为异常。我已经向 Kubernetes bug-tracker报告了一个问题,但我想了解为什么 Linux 内核没有关闭此类连接。

根据其文档(搜索 tcp_fin_timeout),处于 FIN_WAIT2 状态的连接应该在 X 秒后被内核关闭,其中 X 可以从 /proc 读取。在我的机器上它设置为 60:

$ cat /proc/sys/net/ipv4/tcp_fin_timeout
60
Run Code Online (Sandbox Code Playgroud)

所以如果我理解正确的话,这样的连接应该在 60 秒后关闭。但事实并非如此,他们在这种状态下停留了几个小时。

虽然我也明白 FIN_WAIT2 连接非常不寻常(这意味着主机正在等待来自连接远程端的一些 ACK,但它可能已经消失了)我不明白为什么这些连接没有被系统“关闭” .

有什么我可以做的吗?

请注意,重新启动相关进程是最后的手段。

connection kernel tcp linux-networking

12
推荐指数
1
解决办法
4万
查看次数

fsck 一个卷需要多长时间?

我们正在运行一个网站,目前提供 3-5 百万次页面浏览。我们的站点是一个文件共享站点,因此它包含 250,000 个文件和几千个符号链接。

硬盘为1500GB SATA盘。

使用hdparm我们才知道,我们的硬盘速度已经降到了15-20 MB/s,也就是80 MB/s。

所以现在我们要运行fsck来修复磁盘问题。

  1. 请问fsck会解决这个问题吗?
  2. fsck完成需要多少时间(只是我们想计算我们将要拥有的停机时间)?

linux hard-drive kernel fsck capacity-planning

11
推荐指数
1
解决办法
6万
查看次数