我问了之前的一个问题,试图找出将应用程序从 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) 我管理一个 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) 我的计算机最近内存不足(在处理大型 GIS 数据集时编译软件的意外后果)。在详细说明它如何处理 OOM 条件的系统日志中,有以下行:
Out of memory: Kill process 7429 (java) score 259 or sacrifice child
Run Code Online (Sandbox Code Playgroud)
那是or sacrifice child关于什么的?肯定不是在考虑一些黑暗的仪式来让事情继续下去吗?
我从某处读到 Android 使用 Linux 内核。真的吗?我认为 Linux 内核是为桌面操作系统设计的。
假设我有一些问题已由官方 Linux git 存储库的最新补丁修复。我有一个变通方法,但是当发布包含我的修复程序的版本时,我想撤消它。我知道确切的 git commit hash,例如f3a1ef9cee4812e2d08c855eb373f0d83433e34c。
回答这个问题最简单的方法是什么:到目前为止,哪些内核版本包含这个补丁?如果不需要本地 Linux git 存储库,则可以加分。
(LWM讨论了一些想法,但这些确实需要本地存储库。)
我正在运行基于 Linux 3.10.5-1 内核的 Arch。该系统使用以太网接口 enp*s* 和 wlp* 等新的事实上的命名约定。然而,这是一个问题,因为我的教育机构正在使用一个名为Maple 17的程序。Maple 的许可系统依赖于名为 eth0 的接口的存在,因为它必须检索其 MAC 地址以验证许可证。这是一个糟糕的解决方案,但我必须解决它。
这意味着我将需要一个具有任何 MAC 地址的 eth0 接口(因为我可以为新的 MAC 地址检索新的许可证文件),这不一定必须工作。事实上,它应该一直处于停机状态。我认为有几种方法可以尝试解决这个问题,但我无法找到任何关于任何想法的信息。
我能找到的内容仅涵盖更改为较新的约定和较旧版本的 udev。无论如何,他们只在 RHEL 和 SuSe 上工作。不过我没有运气就试过了。(persistent-net-names.rules 和 net-name-slot.rules,它们都让我的实际界面停止工作,我的 wlan 界面消失了)
我有一个三星笔记本电脑(Chronos的S7)与总线一个SATA硬盘ata:1,它被检测为/dev/sda,一个8G SSD上ata:2,/dev/sdb和上SATA接口的其余各种其他装置。
问题是SSD盘是
现在这个磁盘:
/dev/sdb失败而无法挂起。请注意,我可以忍受启动时的延迟——让我担心的是恢复/挂起的事情。
所以问题是:我可以告诉内核避免在 ata:2 上探测设备吗?
在较旧的内核 (<3.0) 中,当我仍然能够深入挖掘源代码时,有一个样式的命令行参数hdb=ignore可以解决问题。
我已经尝试了下面提出的所有技巧udev和libata:force内核参数,但无济于事。具体来说,以下不起作用:
添加到以下/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)
也没有很多中间解决方案——这使得启动后无法访问磁盘,但它在启动时被探测,并在挂起时仍然检查——导致挂起失败。
编辑系统文件/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)
同样,这也有一些效果,从用户空间屏蔽了磁盘,但内核仍然可以看到磁盘。
使用参数的所有可能组合(好吧,很多)引导libata:force(例如在这里找到)以禁用 DMA、降低速度或任何有关故障磁盘的问题 --- 不起作用。使用了该参数,但磁盘仍被探测并失败。
完整 …
我打算用一些 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-util和edac-ctl可执行文件。其中之一可以用于此目的吗?
当我尝试自己实现C字符串库时,发现glibc和Linux内核在实现某些功能的方式上有所不同。例如,glibc memchr和glibc strchr使用一些技巧来加速函数,但内核 memchr和内核 strchr没有。为什么 Linux 内核函数没有像 glibc 那样优化?
我在很多地方读到 Linux 为 Java VM 中的每个用户线程创建一个内核线程。(我看到术语“内核线程”以两种不同的方式使用:
我说的是后一种。)
内核线程是否与内核进程相同,因为 Linux 进程支持父子进程之间的共享内存空间,还是真的是一个不同的实体?
linux-kernel ×10
glibc ×2
kernel ×2
linux ×2
block-device ×1
cpu ×1
ecc ×1
git ×1
iproute ×1
libraries ×1
networking ×1
process ×1
ram ×1
scheduling ×1
security ×1
setuid ×1
source ×1
thread ×1