根据 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
我正在尝试在一组独立的 CPU 上运行多线程基准测试。长话短说,我最初尝试使用isolcpus和taskset,但遇到了问题。现在我在玩 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 上:
嗯?一些进程显示为在屏蔽内核上运行。为了排除 htop 存在错误的情况,我还尝试使用taskset检查显示为在屏蔽中的进程的亲和掩码。
也许那些任务是不可移动的?让我们选择一个显示为在 CPU3 上运行的任意进程(应该在屏蔽中)htop,看看它是否出现在系统 cgroup 中,根据cset:
$ cset shield …Run Code Online (Sandbox Code Playgroud) 我有一个 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)
但是,我仍然希望为所有其他接口保留反向路径过滤 - 我错过了什么?
我已经打电话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) 我知道你可以这样做:
sudo modprobe -v some_module
Run Code Online (Sandbox Code Playgroud)
检查 的版本/lib/modules/.../some_module.ko,但我仍然希望能够检查不一定要由modprobe.
我(和一位同事)刚刚注意到并测试过,当一台 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) 我已经使用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) 如何确定要删除哪些内核以释放/boot分区上的一些空间。
这是一个场景(一些背景信息)。
# df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/sda1 99M 81M 14M 86% /boot
...
Run Code Online (Sandbox Code Playgroud)
# 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)
# 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)
我有一个叫长寿命过程中的问题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,但它可能已经消失了)我不明白为什么这些连接没有被系统“关闭” .
有什么我可以做的吗?
请注意,重新启动相关进程是最后的手段。
我们正在运行一个网站,目前提供 3-5 百万次页面浏览。我们的站点是一个文件共享站点,因此它包含 250,000 个文件和几千个符号链接。
硬盘为1500GB SATA盘。
使用hdparm我们才知道,我们的硬盘速度已经降到了15-20 MB/s,也就是80 MB/s。
所以现在我们要运行fsck来修复磁盘问题。
fsck会解决这个问题吗?fsck完成需要多少时间(只是我们想计算我们将要拥有的停机时间)?kernel ×10
linux ×6
arp ×1
boot ×1
centos ×1
centos6 ×1
cgroup ×1
connection ×1
filtering ×1
fsck ×1
hard-drive ×1
icmp ×1
multi-core ×1
partition ×1
performance ×1
ping ×1
postgresql ×1
routing ×1
shmmax ×1
tcp ×1
ubuntu ×1
ubuntu-16.04 ×1
vmstat ×1