我知道 /proc/sys/fs/file-max 定义了打开文件描述符的最大数量,可以在运行时或启动期间设置。
但是:它的默认值是多少?检查我公司的 10 台服务器给了我 7 个不同的值,这些值似乎都是随机的。
内核文档只是不断提到可以更改该值 - 但没有提到如何计算默认值。
你们中有人知道如何确定默认值吗?
如果我使用我的机器 [Ubuntu 16.04 64 位,内核 4.4] 一段时间,QEMU 需要删除内核缓存,否则,它将无法分配 RAM。
为什么会发生?
这是一个示例运行:
~$ 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
total used free shared buff/cache available
Mem: 15050 1799 9446 56 3803 9414
Swap: 0 0 0
~$ sudo …Run Code Online (Sandbox Code Playgroud) 数据包如何从网络接口队列调度到 CPU,然后再转发到线程进行处理?在涉及如何跨队列散列数据包、硬件中断与软中断、CPU/内存/应用程序/线程局部性以及多线程与多进程守护进程时,需要考虑什么,以避免尽可能多的数据包重新调度/复制?
我有一个多线程网络守护进程(比如,Unbound 解析器)在 Debian amd64 和 Linux 2.6.32(是的,旧的)上运行 16 个本机线程,因此应用程序负载分布在 16 个 CPU 上。网卡是 bnx2 (BCM5709S),支持 8 个 MSI-X rx/tx 队列。每个队列的 IRQ 通过静态映射 /proc/irq/n/smp_affinity 中的中断亲和性分配给单独的 CPU(irqbalance 从来没有做得很好),队列散列类型(RSS 类型)是默认的(IP src+dst , TCP 运动+dport),使用默认的散列键。
所有这些都有助于分散负载,但并不均匀:通常有一个应用程序线程完成其他线程两倍的工作(=每秒请求数),一个 CPU(可能是处理该特定线程的一个)软中断率是其他线程的两倍CPU。
CPU 启用了超线程,但我还没有做任何事情来在“真实”内核之间分散负载(我真的应该这样做)。
Linux 附带了一个相当全面的网络扩展文档,但我遗漏了一些空白:
该文档是关于 RSS 配置的:
如果设备支持足够的队列,典型的 RSS 配置将是每个 CPU 有一个接收队列,否则每个内存域至少有一个接收队列,其中内存域是一组共享特定内存级别(L1、L2 、NUMA 节点等)。
问:如何确定服务器的 CPU/缓存/内存域配置?
有关接收流控制 (RFS) 的信息似乎回答了我关于将数据包发送到正确的 CPU/线程的一些问题:
RFS 的目标是通过将数据包的内核处理引导到正在运行使用数据包的应用程序线程的 CPU 来提高数据缓存命中率。
Q:在DNS解析的情况下,通常有一个查询包和一个应答包。使用多线程守护进程,是否只有一个线程运行 bind()+recvfrom(),因此在将工作调度到其他线程之前,无论如何必须处理所有新传入的数据包?这个特殊的用例会从分叉操作(每个 CPU 一个进程)中受益吗?
问:那么接收流控制通常最适合多线程 TCP 守护进程吗?
Q:如何确定是多线程还是多进程操作?显然有共享内存和数据结构、资源争用等,但我正在考虑数据包流和应用程序侦听器。
问:如果没有接收流控制,或者使用简单的 UDP 服务,数据包是否会到达“错误”的 CPU,因此会以某种方式重新调度到“正确”的 CPU?这会触发 NET_RX 软中断吗?
Q:网卡队列和CPU之间是否有NET_RX软中断?CPU 和监听线程/进程之间是否也有一个?如果接收线程将数据包调度到工作线程,是否还有另一个可能?
太糟糕了,Ben Hutchings …
是否可以在 OOM 杀手日志中查看完整的程序命令行参数?我现在在 /var/log/syslog 中看到的是
Memory cgroup out of memory: Kill process 29187 (beam.smp) score 998 or sacrifice child
Killed process 29302 (cpu_sup) total-vm:4300kB, anon-rss:76kB, file-rss:272kB
beam.smp invoked oom-killer: gfp_mask=0xd0, order=0, oom_score_adj=0
beam.smp cpuset=/ mems_allowed=0-3
Run Code Online (Sandbox Code Playgroud)
我的机器上有很多 beam.smp 进程,要找出被 OOM 杀手杀死的特定进程不是很方便。
我正在使用 Debian 8 amd64 机器进行基准测试。在实验过程中,我希望 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 fr' 当前 CPU 频率为 4.00 GHz。 当前 CPU 频率为 3.99 GHz。 当前 CPU 频率为 4.00 GHz。 当前 CPU …
linux performance central-processing-unit linux-kernel benchmark
Linux 绑定驱动程序是否有一个底层的管理或诊断接口来确定内部发生了什么?
多年来,我一直在 Linux 机器和 Cisco 交换机之间使用链路聚合。在设置 Linux 端根本不响应 Cisco LACP 数据包的新机器时,我会定期遇到死胡同。我对每台服务器都严格遵循一套严格的说明,但结果似乎各不相同。
无论绑定包含一个从属设备还是八个从属设备,tcpdump 都会显示来自所有绑定接口上的交换机的 LACP 数据包,并且没有数据包被传回。事实上,没有数据包是传输周期。 rx_packets为接口显示可观的流量,但tx_packets为零。日志中没有关于 MII 或绑定的有趣内容。甚至没有任何错误。
目前,我正在处理一个只有两个网卡的盒子。目前,我的债券中只有 eth1。显然,这是一个退化的配置。这种情况不会随着 eth0 和 eth1 在债券中而改变;当网络堆栈完全关闭时,它只会使机器更难工作。如有必要,我可以为两个 nic 重新配置它并通过管理界面 (DRAC),但我无法通过这种方式从框中复制粘贴。
一些预习:
这是今天下载的 debian 8.6。
Linux box 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2
(2016-10-19) x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
一个简写的配置:
iface eth1 inet manual
auto bond0
iface bond0 inet manual
slaves eth1
address 10.10.10.10
netmask 255.255.255.0
bond_mode 4
bond_miimon 100
bond_downdelay 200
bond_updelay 200 …Run Code Online (Sandbox Code Playgroud) 我的服务器和客户端软件都在 Linux 上运行。
服务器广播多播,客户端监听多播。
我的客户必须迁移到另一个站点,
不幸的是,两个站点之间不允许多播:-(
如何在两个站点之间传送组播?
- 通过 TCP 还是 UDP?
- 你推荐什么工具?
- 延迟呢?
我收到了一个关于Cisco配置 (GRE)的好答案,
但其中一个网络团队不想对其进行监控/维护,
=> 当传输中断时,支持团队将花费太多时间来理解和修复。
=> 那么,什么应该是 GRE 的最佳替代方案?
是否有基于Linux 内核功能
或网卡功能的解决方案?(低延迟很重要)
使用示例值得赞赏:-)
当前:服务器和客户端在同一站点
未来:服务器和客户端,每个都在不同的站点上
多播频道:225.1.0.1:6666
我们的数据库服务器(主要是基于Debian的稳定的软件包(=目前喘息)似乎有大约4倍以上的内核相同的工作量负荷3.2.0-4-amd64然后在它的前面的2.6.32-5-amd64内核。与所有的包中,我们可以清楚的其他内核同样与启动看到差异,我不知道为什么。问题是,我没有看到太多的 IO 或 CPU 负载差异。
设置默认kernel.sched_min_granularity_ns和kernel.sched_latency_ns回到它的 2.6.32价值观可以帮助一点点(三次负载,而不是4倍),而不是我们希望的水平。由于许多内核设置发生了变化,我们很难盲目地将新内核设置为旧内核的默认值2.6。
有没有其他人有这方面的经验?如果是这样,是什么导致了这种情况(理想情况下:如何解决)?
由于它与内核相关,因此 sysctl 值的差异可能会引起人们的兴趣:这里是 2 的差异(粘贴合并以防止出现过长的问题)。
编辑:目前我们正在调查这个 SO 答案,看看是否适用。
我们目前正在设置一些本地网络服务器以在完整的 ipv4 网络中运行。我可以肯定,这个网络没有 ipv6 支持,永远不会。
在那旁边,
我们需要以某种方式完全禁用 Linux 服务器内核上的 ipv6 支持。
是的,我可以在谷歌上搜索一些 sysctl 设置,但这还不够。例如,在默认设置中/etc/hosts,我也发现了一些 ipv6 记录。我不会让它在以后惹出什么麻烦。
究竟需要做什么才能从全新安装的 debian 中完全删除整个 ipv6 支持?最好的是清单/待办事项清单,但任何其他形式也可以。
我检查/etc了很多配置文件,但我不能确定我找到了所有东西。
有什么更好的想法吗?有没有“清单”,需要设置什么?
我管理一些运行 Amazon Linux(不确定是什么版本)的 EC2 实例,这些实例需要安全补丁。
很多软件都打了很好的补丁,但我们一直停留在内核升级上。我们无法按照我们的意愿使用最新的内核版本。我们做了什么?
yum update。系统报告我们已经获得了预期的最新内核版本,并且不再需要更新任何内容。uname -r。它报告我们仍然使用相同的内核版本,而不是我们期望的最新内核版本。我们错过了什么要点?请帮忙。
kernel amazon-ec2 linux-kernel amazon-web-services amazon-linux
linux-kernel ×10
linux ×6
kernel ×2
amazon-ec2 ×1
amazon-linux ×1
benchmark ×1
bonding ×1
cache ×1
debian ×1
ipv4 ×1
ipv6 ×1
lacp ×1
multicast ×1
mysql ×1
networking ×1
oom-killer ×1
performance ×1
qemu ×1
scalability ×1
tcp ×1
threads ×1