标签: linux-kernel

CFS 的 CPU 使用率高?

我问了之前的一个问题,试图找出将应用程序从 RHEL 5 迁移到 RHEL 6 时 CPU 使用率增加的原因。我为此所做的分析似乎表明它是由内核中的 CFS 引起的。我编写了一个测试应用程序来尝试验证是否是这种情况(原始测试应用程序已删除以适应大小限制,但在git repo 中仍然可用

我在 RHEL 5 上使用以下命令编译它:

cc test_select_work.c -O2 -DSLEEP_TYPE=0 -Wall -Wextra -lm -lpthread -o test_select_work
Run Code Online (Sandbox Code Playgroud)

然后我调整了参数,直到戴尔 Precision m6500 上每次迭代的执行时间约为 1 毫秒。

我在 RHEL 5 上得到以下结果:

./test_select_work 1000 10000 300 4
time_per_iteration: min: 911.5 us avg: 913.7 us max: 917.1 us stddev: 2.4 us
./test_select_work 1000 10000 300 8
time_per_iteration: min: 1802.6 us avg: 1803.9 us max: 1809.1 us stddev: 2.1 us
./test_select_work 1000 …
Run Code Online (Sandbox Code Playgroud)

cpu scheduling kernel linux-kernel

26
推荐指数
1
解决办法
4014
查看次数

解决这个 glibc 问题的最佳方法是什么?

我管理一个 Gentoo Hardened box,它使用文件功能来消除对 setuid-root 二进制文件的大部分需求(例如,/bin/ping有 CAP_NET_RAW 等)。

事实上,我剩下的唯一二进制文件就是这个:

abraxas ~ # find / -xdev -type f -perm -u=s
/usr/lib64/misc/glibc/pt_chown
abraxas ~ # 
Run Code Online (Sandbox Code Playgroud)

如果我删除了 setuid 位,或者重新挂载我的根文件系统nosuid,sshd 和 GNU Screen 将停止工作,因为它们调用grantpt(3)了它们的主伪终端,而 glibc 显然会执行这个程序来 chown 和 chmod 下的从伪终端/dev/pts/,而 GNU Screen 关心这个函数的时间失败。

问题是,手册页grantpt(3)明确指出,在 Linux 下,devpts挂载文件系统后,不需要此类帮助程序二进制文件;内核会自动将slave的UID & GID设置为打开的进程的真实UID & GID /dev/ptmx(通过调用getpt(3))。

我编写了一个小示例程序来演示这一点:

#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main(void)
{
    int master; …
Run Code Online (Sandbox Code Playgroud)

security setuid glibc linux-kernel

26
推荐指数
1
解决办法
1151
查看次数

什么是 Out of Memory 信息:牺牲孩子?

我的计算机最近内存不足(在处理大型 GIS 数据集时编译软件的意外后果)。在详细说明它如何处理 OOM 条件的系统日志中,有以下行:

Out of memory: Kill process 7429 (java) score 259 or sacrifice child
Run Code Online (Sandbox Code Playgroud)

那是or sacrifice child关于什么的?肯定不是在考虑一些黑暗的仪式来让事情继续下去吗?

linux-kernel out-of-memory

26
推荐指数
1
解决办法
5万
查看次数

Android 真的使用与 Linux 相同的内核吗?

我从某处读到 Android 使用 Linux 内核。真的吗?我认为 Linux 内核是为桌面操作系统设计的。

linux-kernel

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

给定一个 git commit hash,如何找出哪个内核版本包含它?

假设我有一些问题已由官方 Linux git 存储库的最新补丁修复。我有一个变通方法,但是当发布包含我的修复程序的版本时,我想撤消它。我知道确切的 git commit hash,例如f3a1ef9cee4812e2d08c855eb373f0d83433e34c

回答这个问题最简单的方法是什么:到目前为止,哪些内核版本包含这个补丁?如果不需要本地 Linux git 存储库,则可以加分。

LWM讨论了一些想法,但这些确实需要本地存储库。)

linux source git linux-kernel

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

我可以创建一个名为 eth0 的虚拟以太网接口吗?

我正在运行基于 Linux 3.10.5-1 内核的 Arch。该系统使用以太网接口 enp*s* 和 wlp* 等新的事实上的命名约定。然而,这是一个问题,因为我的教育机构正在使用一个名为Maple 17的程序。Maple 的许可系统依赖于名为 eth0 的接口的存在,因为它必须检索其 MAC 地址以验证许可证。这是一个糟糕的解决方案,但我必须解决它。

这意味着我将需要一个具有任何 MAC 地址的 eth0 接口(因为我可以为新的 MAC 地址检索新的许可证文件),这不一定必须工作。事实上,它应该一直处于停机状态。我认为有几种方法可以尝试解决这个问题,但我无法找到任何关于任何想法的信息。

  • 创建没有连接的适配器
  • 为 enp3s0 创建一个名为 eth0 的别名
  • 重命名 enp3s0 或环回接口。

我能找到的内容仅涵盖更改为较新的约定和较旧版本的 udev。无论如何,他们只在 RHEL 和 SuSe 上工作。不过我没有运气就试过了。(persistent-net-names.rules 和 net-name-slot.rules,它们都让我的实际界面停止工作,我的 wlan 界面消失了)

networking linux-kernel iproute

25
推荐指数
1
解决办法
5万
查看次数

如何告诉 Linux Kernel &gt; 3.0 完全忽略故障磁盘?

我有一个三星笔记本电脑(Chronos的S7)与总线一个SATA硬盘ata:1,它被检测为/dev/sda,一个8G SSD上ata:2/dev/sdb和上SATA接口的其余各种其他装置。

问题是SSD盘是

  • 焊接到主板上(不可移动)
  • 被破坏(它只会为任何操作提供 I/O 错误)
  • 它没有出现在 bios 中(可能是因为它坏了)

现在这个磁盘:

  • 尝试探测故障磁盘的启动延迟了三到五分钟,这很烦人;
  • 但最烦人的是系统因为/dev/sdb失败而无法挂起。

请注意,我可以忍受启动时的延迟——让我担心的是恢复/挂起的事情。


所以问题是:我可以告诉内核避免在 ata:2 上探测设备吗?

在较旧的内核 (<3.0) 中,当我仍然能够深入挖掘源代码时,有一个样式的命令行参数hdb=ignore可以解决问题。

我已经尝试了下面提出的所有技巧udevlibata:force内核参数,但无济于事。具体来说,以下不起作用:

  1. 添加到以下/etc/udev/rules.d/文件之一(在早期执行中00-ignoredisk.rules或晚期执行99-ignoredisk.rules或在两个地方)

    SUBSYSTEMS=="scsi", DRIVERS=="sd", ATTRS{rev}=="SSD ", ATTRS{model}=="SanDisk iSSD P4 ", ENV{UDISKS_IGNORE}="1" 
    
    Run Code Online (Sandbox Code Playgroud)

    也不

    KERNEL=="sdb", ENV{UDISKS_IGNORE}="1"
    
    Run Code Online (Sandbox Code Playgroud)

    也没有很多中间解决方案——这使得启动后无法访问磁盘,但它在启动时被探测,并在挂起时仍然检查——导致挂起失败。

  2. 编辑系统文件/lib/udev/rules.d/60-persistent-storage.rules(和udisks, udisks2)改变

    KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md", GOTO="persistent_storage_end"
    
    Run Code Online (Sandbox Code Playgroud)

    KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md|sdb*", GOTO="persistent_storage_end"
    
    Run Code Online (Sandbox Code Playgroud)

    同样,这也有一些效果,从用户空间屏蔽了磁盘,但内核仍然可以看到磁盘。

  3. 使用参数的所有可能组合(好吧,很多)引导libata:force(例如在这里找到)以禁用 DMA、降低速度或任何有关故障磁盘的问题 --- 不起作用。使用了该参数,但磁盘仍被探测并失败。

    完整 …

block-device linux-kernel

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

如何判断 RAM ECC 是否正常工作?

我打算用一些 ECC RAM 来替换我目前安装在 Asus M5A97 Pro 主板(AMD 970 芯片组,FX-6100 CPU)上的非 ECC RAM。

安装内存后,如何判断内存的ECC功能是否正常?

我想过dmidecode --type memory每个 RAM 棒当前打印的是哪些:

Error Information Handle: Not Provided
Total Width: 64 bits
Data Width: 64 bits
Run Code Online (Sandbox Code Playgroud)

(首先,我希望每字节 1 位 ECC 数据宽度保持为 64 位,但总宽度为 72 位。)

这可以用于确定 ECC 是否有效吗?或者 dmidecode 太低了?我还能使用什么(除了等待并查看日志中是否出现 ECC 错误,这表明它正在工作但不是它不工作)?

更新:我后来想到了 edac-utils。安装它们,我得到Not enabling Memory Error Detection and Correction since EDAC_DRIVER is not set. 这给了我edac-utiledac-ctl可执行文件。其中之一可以用于此目的吗?

linux-kernel ram ecc

25
推荐指数
2
解决办法
4万
查看次数

为什么 Linux 内核没有像 glibc 那样优化功能(例如,memchr、strchr)?

当我尝试自己实现C字符串库时,发现glibc和Linux内核在实现某些功能的方式上有所不同。例如,glibc memchrglibc strchr使用一些技巧来加速函数,但内核 memchr内核 strchr没有。为什么 Linux 内核函数没有像 glibc 那样优化?

libraries glibc linux-kernel

25
推荐指数
2
解决办法
4785
查看次数

Linux内核线程真的是内核进程吗?

我在很多地方读到 Linux 为 Java VM 中的每个用户线程创建一个内核线程。(我看到术语“内核线程”以两种不同的方式使用:

  1. 为执行核心操作系统工作而创建的线程和
  2. 操作系统知道并安排执行用户工作的线程。

我说的是后一种。)

内核线程是否与内核进程相同,因为 Linux 进程支持父子进程之间的共享内存空间,还是真的是一个不同的实体?

linux process kernel thread linux-kernel

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