背景:物理服务器,大约两年,7200-RPM SATA 驱动器连接到 3Ware RAID 卡,ext3 FS 挂载 noatime 和 data=ordered,不在疯狂负载下,内核 2.6.18-92.1.22.el5,正常运行时间 545 天. 目录不包含任何子目录,只有数百万个小(~100 字节)文件,还有一些更大的(几 KB)文件。
我们有一台服务器在过去几个月中出现了一些问题,但我们直到前几天才注意到它,因为它开始无法写入目录,因为它包含太多文件。具体来说,它开始在 /var/log/messages 中抛出这个错误:
ext3_dx_add_entry: Directory index full!
Run Code Online (Sandbox Code Playgroud)
有问题的磁盘有大量剩余的 inode:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 60719104 3465660 57253444 6% /
Run Code Online (Sandbox Code Playgroud)
所以我猜这意味着我们达到了目录文件本身可以有多少条目的限制。不知道会有多少文件,但正如您所见,不能超过三百万左右。不是那么好,请注意!但这是我的问题之一:上限到底是多少?是可调的吗?在我被骂之前——我想把它调低;这个庞大的目录导致了各种各样的问题。
无论如何,我们在生成所有这些文件的代码中找到了问题,我们已经更正了它。现在我坚持删除目录。
这里有几个选项:
rm -rf (dir)
我先试过这个。在它运行了一天半没有任何明显影响后,我放弃并杀死了它。
while [ true ]; do ls -Uf | head -n 10000 | xargs rm -f 2>/dev/null; …有没有标准的方法来列出加载的 Linux 模块的参数值?我基本上是在探索这个Linux 内核模块参数问题的另一个答案,因为我感兴趣的模块没有/sys/modules/<module_name>/parameters接口。
时不时地,我被告知要提高“dd”的速度,我应该仔细选择合适的“块大小”。
即使在这里,在 ServerFault 上,其他人也写道“ ...最佳块大小取决于硬件... ” (iain)或“ ...完美的大小将取决于您的系统总线、硬盘驱动器控制器、特定驱动器本身,以及每个驱动程序...... ” (克里斯 - s)
由于我的感觉有点不同(顺便说一句:我认为深度调整 bs 参数所需的时间远高于获得的增益,在节省时间方面,并且默认是合理的),今天我刚去了通过一些快速而肮脏的基准测试。
为了降低外部影响,我决定阅读:
和:
在下表中,我报告了我的发现,读取了具有不同“bs”值的 1GB 数据(您可以在此消息的末尾找到原始数字):

基本上得出的结论是:
MMC:使用 bs=4(是的!4 字节),我达到了 12MB/s 的吞吐量。我从 bs=5 及以上得到的最大 14.2/14.3 的值并不那么遥远;
硬盘:bs=10 我达到了 30 MB/s。肯定低于默认 bs=512 获得的 95.3 MB,但......也很重要。
此外,很明显,CPU 系统时间与 bs 值成反比(但这听起来很合理,因为 bs 越低,dd 生成的系统调用数量就越高)。
说了以上所有,现在的问题是:有人可以解释(内核黑客?)这种吞吐量所涉及的主要组件/系统是什么,以及是否真的值得努力指定高于默认值的 bs?
root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=1M count=1000
1000+0 …Run Code Online (Sandbox Code Playgroud) 我正在运行一个自定义编译的 3.18.9 内核,我想知道在系统上禁用交换的最佳方法。如果它有所作为,我也会使用 init。
是否足以注释或删除交换行/etc/fstab以防止交换在启动时工作/挂载,或者我应该重新编译内核而Support for paging of anonymous memory (swap)不是 100% 确定它没有被启用?
我运行加密分区并希望防止意外泄漏到硬盘。我的系统规格也足够好,我可以在无交换环境中生存。
当我使用默认设置时:
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
Run Code Online (Sandbox Code Playgroud)
我可以从/proc/meminfo文件中读取这些值:
CommitLimit: 2609604 kB
Committed_AS: 1579976 kB
Run Code Online (Sandbox Code Playgroud)
但是,当我vm.overcommit_memory从更改0为 时2,我无法启动更改前可以启动的同一组应用程序,尤其是 amarok。我不得不更改vm.overcommit_ratio为300,因此可以增加限制。现在,当我启动 amarok 时,/proc/meminfo显示以下内容:
CommitLimit: 5171884 kB
Committed_AS: 3929668 kB
Run Code Online (Sandbox Code Playgroud)
这台机器只有 1GiB 的内存,但是 amarokvm.overcommit_memory设置为 0时没有问题。但是在设置为 的情况下2,amarok 需要分配超过 2GiB 的内存。这是正常行为吗?如果是这样,谁能解释为什么,例如,firefox(比 amarok 消耗的内存多 4-6 倍)在更改前后以相同的方式工作?
任何人都可以通俗地解释软限制和硬限制之间的区别是什么?
我应该将软限制和硬限制设置为相同吗?或者软度应该显着降低?无论哪种方式,系统都会受益吗?
如何在不查看的情况下检查哪些选项被编译到 Linux 内核中,/boot/config-*以及我是否无权访问/boot/config-*剩余的文件?
偶尔我会遇到具有高处理器中断时间百分比的服务器(Windows 2003 和 2008)。有没有办法查看导致中断的程序或设备?
操作系统:Ubuntu 8.04 LTS 服务器版
我们刚刚使用以下命令回滚了内核更新:
sudo apt-get remove linux-image-2.6.24-24-server
Run Code Online (Sandbox Code Playgroud)
卸载成功,但是apt-get退出前提示如下信息:
The link /vmlinuz is a damaged link
Removing symbolic link vmlinuz
you may need to re-run your boot loader[grub]
The link /initrd.img is a damaged link
Removing symbolic link initrd.img
you may need to re-run your boot loader[grub]
Run Code Online (Sandbox Code Playgroud)
我们应该担心这个消息吗?我们需要重新运行 GRUB 吗?如果我们必须重新运行 GRUB,我们该怎么做呢?
提前致谢。
我对 net.core.somaxconn 参数产生了争论:有人告诉我,如果我们更改默认值 128,它不会有任何区别。
我相信这可能足以证明:
“如果积压参数大于 /proc/sys/net/core/somaxconn 中的值,则它会被静默截断为该值” http://linux.die.net/man/2/listen
但事实并非如此。
有谁知道一种方法可以用两台机器来证明这一点,坐在 Gbit 网络上?最好的方法是针对 MySQL、LVS、apache2 (2.2)、memcached。
kernel ×10
linux ×7
ubuntu ×2
dd ×1
debugging ×1
directory ×1
disk-image ×1
ext3 ×1
grub ×1
init ×1
interrupts ×1
memory ×1
networking ×1
performance ×1
rm ×1
rollback ×1
swap ×1
sysctl ×1
ulimit ×1
windows ×1