分类 技术 下的文章

Linux内核需要为临时对象如任务或者设备结构和节点分配内存,缓存分配器管理着这些类型对象的缓存。现代Linux内核部署了该缓存分配器以持有缓存,称之为片。不同类型的片缓存由片分配器维护。本文集中讨论slabtop命令,该命令显示了实时内核片缓存信息。

1. 命令用法:

该命令用起来很简单,默认执行时不要求任何参数。但是它要求root特权来读取内核片信息。以普通用户执行该命令会出现以下错误:

Run slabtop as non-privileged user

你可以在前面设置“sudo”来运行该命令,默认输出见下图:

Slabtop default output

要退出slabtop,只需敲‘q’,就像在top命令中那样。

2. Slabtop选项:

2.1 显示间隔:

默认情况下,slabtop每隔3秒刷新一次。但是,如果你想要调整,可以使用-d或者--delay=N选项来调整刷新间隔,以秒为单位:

Custom delay interval 01

Custom delay interval 02

2.2 排序标准:

在slabtop输出中有很多字段,-s或--sort=S选项可以根据指定的排序标准对这些字段排序。该选项将在下一节中详细讲述。

2.3 输出一次:

-o或--once选项不会刷新输出,它仅仅将一次输出结果丢给STDOUT,然后退出。

Output once and exit

2.4 版本信息:

-V或--version选项显示命令的版本并退出。

Slabtop version

2.5 帮助:

常见选项,-h或--help显示命令的使用帮助。

Slabtop help options

3. 排序标准:

排序标准确定了哪个片缓存显示在顶部,下面是slabtop的排序标准:

3.1 活跃:

缓存可以通过‘a’来对活跃对象编号进行排序。

Sort by Active 01

Sort by Active 02

3.2 对象/分片:

每分片对象数可以使用“b”来选择。

Sort by objects per slab 01

Sort by objects per slab 02

3.3 缓存大小:

要选择缓存大小,你需要提供“c”选项。

Sort by cache size 01

Sort by cache size 02

3.4 分片:

分片数量,使用“l”来选择。

Sort by number of slabs 01

Sort by number of slabs 02

3.5 活跃分片:

活跃分片数量。(注意:这不同于上面讲得活跃对象数量。)使用“v”来根据该标准排序。

Sort by Active Slabs 01

Sort by Active Slabs 02

3.6 名称:

缓存名称。相关字符是“n”。

Sort by cache name 01

Sort by cache name 02

3.7 对象:

要根据对象数量排序,使用“o”。

Sort by number of objects 01

Sort by number of objects 02

3.8 每分片页面数:

“p”将根据每分片页面数排序。

Sort by pages per slab 01

Sort by pages per slab 02

3.9 对象大小:

对象大小排序由“s”来指定。

Sort by object size 01

Sort by object size 02

3.10 使用:

“u”选项根据缓存使用量排序。

Sort by cache utilization 01

Sort by cache utilization 02


via: http://linoxide.com/linux-command/kernel-slab-cache-information/

译者:GOLinux 校对:校对者ID

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Linux 内核补丁测试

你试过自己写内核补丁吗?本节介绍在把你的补丁包提交到 Linux 邮箱列表之前,需要做哪些操作。另外我们还会介绍如何把它发送出去。

写好代码后,编译它。把 make 过程产生的输出保存到文档中,查看新代码有没有警告信息。找到所有的警告信息,处理掉。当你的代码编译过程没有任何不正常的输出,安装这个内核,然后启动测试。如果启动正常,查看 dmesg 里面有没于错误,与老内核生成的 dmesg 日志做个比较。运行一些压力测试,请参考我们以前讲过的测试内容。如果这个补丁用于修复某个 bug,请确保真的已经修复了。如果真的修复了,请确保能通过系统测试。找出打你补丁的模块下面的回归测试工具,运行一下。如果补丁涉及到其他架构,你需要交叉编译然后测试一下。请通过下面的目录查找测试工具:

如果你对你的补丁测试结果感到很满意,你就可以提交补丁了。请确保提交 commit 的信息要描述得非常清楚。要让内核维护者和其他开发者看懂补丁所修改的内容,这一点非常重要。生成补丁后,执行 scripts/checkpatch.pl 脚本,找到 checkpatch 是产生的错误或警告(如果有的话),修复它们。重新生成补丁,直到补丁通过这个脚本的测试。重新测试这个补丁。将本补丁用于其他的内核源码上,保证不会有冲突产生。

现在你做好提交补丁的准备了。先运行 scriptst/get\_maintainer.pl 来确认你应该把补丁发给哪个内核维护者。注意不要以附件形式发送补丁,而是以纯文本形式粘贴在邮件里面。确保你的邮件客户端可以发送纯文本信息,你可以试试给自己发送一份补丁邮件来测试你的邮件客户端的功能。收到自己的邮件后,运行 checkpatch 命令并给自己的内核源码打上你的补丁。如果这两部都能通过,你就可以给 Linux 邮箱列表发送补丁了。使用 git send-email 命令是提交补丁最安全的方式,可以避免你的邮箱的兼容性问题。你的 .gitconfig 文件里面需要配置好有效的 smtp 服务器,详细操作参考 git 的帮助文档。

更多提交补丁的规矩,请参考下面的资料:

  • linux\_git/Documentation/applying-patches.txt
  • linux\_git/Documentation/SubmitChecklist
  • linux\_git/Documentation/SubmittingDrivers
  • linux\_git/Documentation/SubmittingPatches
  • linuxgit/Documentation/stablekernel\_rules.txt
  • linuxgit/Documentation/stableapi\_nonsense.txt

下面是一些内核测试教程的资料:

内核测试套件和项目

除我们讨论过的测试资源之外,这里还有很多测试项目值得介绍,包括开源的和厂家自己提供的。这些项目每一个都是针对特定领域的,比如嵌入式或者企业自己使用。我们简单过一下。

Linux 测试项目(LTP)测试套件是一系列工具的集合,用于测试内核的可靠性、健壮性和稳定性。你可以为这个项目添加自己的测试代码,并且 LTP 项目欢迎你贡献自己的代码。runltp 脚本默认情况下会测试下面的子系统:

  • 文件系统压力测试
  • 磁盘 IO 测试
  • 内存管理压力测试
  • IPC(进程间通信)测试
  • 调度器测试
  • 命令的功能性验证测试
  • 系统调用功能验证测试

LTP-DDT 是一个基于 LTP 的测试应用(LCTT:就是 LTP 的阉割版么),专注于测试嵌入式设备驱动。

Linux Driver Verification 这个项目的目标是提高 Linux 设备驱动的质量,它为设备驱动验证开发了集成环境平台,并且利用与时俱进的研究来增强验证工具的质量。

一致性测试

如果你有将某个 Unix 平台下的应用一直到另一个平台的经验,你就能理解 Linux Standard Base (LSB) 和 LSB 一致性测试套件的重要性了。LSB 是 Linux Foundation 工作组创建的用于降低支持不同 Linux 平台所需要的开销,方法就是通过降低不同 Linux 发行版之间的差别,保证应用在不同发行版之间的可移植性。前事不忘后事之师,Unix 世界的分歧在 Linux 世界一定要避免。这就是为什么你可以把一个 rpm 包转化成 deb 包后还能安装并正常运行的秘密。

静态分析工具

静态分析之所以会被称为“静态分析”,是因为这些工具只分析代码,并不执行它们。分析 Linux 内核代码的静态分析工具有很多,Sparse 是 Linus Torvalds 写的专门用于检查内核静态类型的工具。它是一个语义检查器,会为 C 语言的语义建立语义检析树,执行惰性类型评估。内核编译系统支持 sparse,并且为编译内核的命令提供开启 sparse 的选项。

为内核所有需要重新编译的 C 文件执行 sparse 语义检查:

make C=1 allmodconfig

为内核所有 C 文件(即使不需要重新编译)执行 sparse 语义检查:

make C=2 allmodconfig

Sparse 的资源:

Smatch 分析程序代码的逻辑错误。它可以检测到诸如“为一个没锁上的 spinlock 执行解锁”的逻辑错误。内核源码支持 smatch:

在 Linux 内核中运行 smatch:

make CHECK="~/path/to/smatch/smatch -p=kernel" C=1 bzImage modules | tee warns.txt

请参考下面的资料来获取和编译 smatch。需要注意的是 smatch 是个正在发展的项目,架构会不断变化。

那么我们该怎么处理 Sparse 和 Smatch 所发现的语义和逻辑上的错误呢?一些错误可以被分离为日常问题或模块问题,可以轻易被解决。但是有些语义错误涉及到全局,因为剪切粘贴了一些代码。在一些环境中,当一些接口函数被废弃不再使用,或者仅仅做了写微小的修改,你就需要大规模更新源码。这时候你需要 Coccinelle 来帮忙。,Coccinelle 使用 SmPL 语言(语义包语言)来为 C 代码提供匹配和转换代码的功能。Coccinelle 的从一开始就作为 Linux 的附属产品持续发展的。

举个例子:foo(int) 函数突然变成 foo(int, char *) 函数,多出了一个输入参数(可以把第二个参数置为 null)。所有调用 foo() 函数的代码都需要更新了,这可能是个悲摧的体力活。但是使用 Coccinelle 的话,这项工作瞬间变得轻松,脚本会帮你找到调用 foo(parameter1) 的代码,然后替换成 foo(parameter1, NULL)。做完这些后,所有调用这个函数的代码都可以运行一遍,验证下第二个参数为 NULL 是否能正常工作。关于 Coccinelle 的更多信息,以及在不同项目中(当然,也包括 Linux 内核这个项目)的使用方法,请参考项目主页:Cocinelle

参考文献

本文涵盖了很多方面,这里列出一些参考文档供读者做进一步研究。

鸣谢

感谢来自 Oracle 的 Khalid Aziz,审查校对并提供许多非常有价值的建议。感谢来自三星的 Mauro Chehab 和 Guy Martin,他们给了我多次反馈。感谢来自 Linux Foundation 的 Grey Kroah-Hartman 对本文的审阅。感谢来自三星的 Ibrahim Haddad,没有他的支持和鼓励,我可能还不会坐下来写出这篇文章。


作者:Shuah Khan

Shuah Khan 是三星公司开源组的高级 Linux 内核开发工程师。 她为 Linux 内核中的 IOMMU、DMA、电源管理、PCIe 贡献代码,同时维护内核,为内核提供补丁包。Shuah 有多年 Unix 内核开发经验。她也为 OpenHPI 和 LLDP 项目作贡献。


via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,5

译者:bazz2 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

如果你在推特上关注了我们,你可能看见了我们最近分享的一张截图,和这张截图一起的还有对它所展示的桌面进行命名的邀请。

你猜对了吗? 答案就是Budgie —— 一种为基于openSUSE 的linux发行版Evolve OS所设计、但不仅仅只能用于 Evolve OS的简易桌面环境。

我们第一次提到Budgie是在三月份,当时我们被它的整洁、小巧的美感、灵活的架构,还有再次使用在当今大多数发行版中所使用的GNOME 3.10 成熟技术中的公共部分和标堆栈的决定所折服。

我对此项目的领导者Ikey Doherty所作出的开发选择非常佩服。无可否认另起炉灶有它的优点,但决定从上游的项目获取帮助将可以整个项目进展得更快,无论是在发展方面(更轻的技术负担)还是在用户可使用方面(更容易在其它发行版上运行)。

除了政治因素选择以外,这款桌面干净、小巧,向谷歌Chrome OS的Ash桌面致敬。如果你不介意有些许粗糙的边缘,那它值得你玩玩。那么怎样在Ubuntu安装Budgie呢?

非官方的PPA是不正式的

开源意味着如果你有一点终端使用知识的话,你就可以在获得Budgie桌面的源代码后进行编译,然后运行。

但如果你很懒,想不费周折就在Ubuntu 14.04 LTS(或者一个基于它的发行版)运行Budgie,那么你可以通过比较容易的途径来实现。

只要添加一个非官方的PPA,刷新你的软件源然后进行安装。几分钟后在这个家庭中你将有一位名叫Bob的新叔叔,并且有一个新的桌面可以玩耍。

添加Budgie PPA

将以下命令复制进一个打开的终端窗口,在提示过后输入你的密码(如果需要的话):

sudo add-apt-repository ppa:sukso96100/budgie-desktop
sudo apt-get update && sudo apt-get install budgie-desktop

登入Budgie会话

安装完成后你就可以在Unity欢迎界面的会话选择器中选择“Budgie”了。(别忘了以后要把选择项改回到稳定的桌面环境)

注意

budgie是不稳定、不完善的,并且它在Ubuntu上也没有被正式支持。它正在积极开发中,功能还仍然有些缺失,包括但不仅限于:不支持网络管理,没有音量控制小程序(键盘按键工作良好),没有通知系统,无法将应用程序“固定”在任务栏。

它对UBUNTU的叠加滚动条、一些GTK主题的支持也不是很好,而且在使用upstart的发行版(例如ubuntu,即使它正在改变之中)中会话管理器(例如,注销,重启等等)将无法工作。

一个应变方法是:禁用叠加滚动条,设置一个默认主题,通过在终端中使用以下命名来退出会话:

gnome-session-quit

脑海中有了上述这些警告后,我得建议那些自己的理智倾向于使用稳定、可靠的系统的人现在暂时不要使用它。

而剩下那些狂热的业余爱好者们呢?好吧,请在下面留言告诉我们你觉得它如何。我给Bob让路。


via: http://www.omgubuntu.co.uk/2014/07/install-budgie-evolve-os-desktop-ubuntu-14-04

译者:Love-xuan 校对:reinoir

本文由 LCTT 原创翻译,Linux中国 荣誉推出

磁盘驱动器速度

磁盘驱动器的速度是以一个单位时间内读写数据量的多少来衡量的。DD 命令是一个简单的命令行工具,它可用对磁盘进行任意数据块的读取和写入,同时可以度量读取写入的速度。

在这篇文章中,我们将会使用 DD 命令来测试 USB 和 SSD 磁盘的读取和写入速度。

数据传输速度不但取决于驱动盘本身,而且还与连接的接口有关。比如, USB 2.0 端口的最大传输速度是 35 兆字节/秒,所以如果您把一个支持高速传输的 USB 3.0 驱动盘插入 USB 2.0 端口的话,它实际的传输速度将是 2.0 端口的下限。

这对于 SSD 也是一样的。 SSD 连接的 SATA 端口有不同的类型。平均是 375 兆字节/秒的 SATA 2.0 端口理论上最大传输速度是 3 Gbit/秒,而 SATA 3.0 是这个速度的两倍。

测试方法

挂载上驱动盘,从终端进入此盘目录下。然后使用 DD 命令,首先写入固定大小块的一个文件,接着读取这个文件。

DD 命令通用语法格式如下:

dd if=path/to/input_file of=/path/to/output_file bs=block_size count=number_of_blocks

当写入到驱动盘的时候,我们简单的从无穷无用字节的源 /dev/zero 读取,当从驱动盘读取的时候,我们读取的是刚才的文件,并把输出结果发送到无用的 /dev/null。在整个操作过程中, DD 命令会跟踪数据传输的速度并且报告出结果。

固态硬盘

我们使用的是一块“三星 Evo 120G” 的固态硬盘。它性价比很高,很适合刚开始用固态硬盘的用户,也是我的第一块固态硬盘,并且也是市场上效果最好的固态硬盘之一。

这次实验中,我们把硬盘接在 SATA 2.0 端口上。

写入速度

首先让我们写入固态硬盘

$ dd if=/dev/zero of=./largefile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 4.82364 s, 223 MB/s

的大小实际上是相当大的。你可以尝试用更小的尺寸如 64K 甚至是 4K 的。

读取速度

现在读回这个文件。但是,得首先清除内存的缓存,以确保这个文件确实是从驱动盘读取的。

运行下面的命令来清除内存缓存

$ sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"

现在读取此文件

$ dd if=./largefile of=/dev/null bs=4k
165118+0 records in
165118+0 records out
676323328 bytes (676 MB) copied, 3.0114 s, 225 MB/s

在 Arch Linux 的维基页上有一整页的关于不同的厂商,如英特尔、三星、Sandisk 等提供的各类固态硬盘 读/写速度的信息。点击如下的 url 可以查看相关信息。

https://wiki.archlinux.org/index.php/SSD\_Benchmarking

USB

此次实验我们会测量普通的 USB/随身笔的读写速度。驱动盘都是接入标准的 USB 2.0 端口的。首先用的是一个 4GB 大小的 sony USB 驱动盘,随后用的是一个 16GB 大小的 strontium 驱动盘。

首先把驱动盘插入端口,并挂载上,使其可读。然后从命令行下面进入挂载的文件目录下。

Sony 4GB - 写入

这个实验中,用 DD 命令向驱动盘写入一个有 10000 块,每块 8K 字节的文件。

# dd if=/dev/zero of=./largefile bs=8k count=10000
10000+0 records in
10000+0 records out
81920000 bytes (82 MB) copied, 11.0626 s, 7.4 MB/s

因此,写入速度约为7.5兆字节/秒。这是一个很低的数字。

Sony 4GB - 读取

把相同的文件读取回来,测试速度。首先运行如下命令清除内存缓存。

$ sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"

现在就可以使用 DD 命令来读取文件了。

# dd if=./largefile of=/dev/null bs=8k
8000+0 records in
8000+0 records out
65536000 bytes (66 MB) copied, 2.65218 s, 24.7 MB/s

读取速度出来大约是25兆字节/秒,这大致跟廉价 USB 驱动盘的标准相匹配吧。

USB2.0 理论上最大信号传输速率为480兆比特/秒,最小为60兆字节/秒。然而,由于各种限制实际传输速率大约280兆比特/秒和35兆字节/秒之间。除了这个,实际的速度还取决于驱动盘本身的质量好坏以及其他的因素。

上面实验中, USB 驱动盘插入USB 2.0 端口,读取的速度达到了 24.7兆字节/秒,这是很不错的读速度。但写入速度就不敢恭维了。

下面让我们用 16GB 的 Strontium 驱动盘来做相同的实验。虽然 Strontium 的 USB 驱动盘很稳定,但它也是一款很便宜的品牌。

Strontium 16gb 盘写入速度

# dd if=/dev/zero of=./largefile bs=64k count=1000
1000+0 records in
1000+0 records out
65536000 bytes (66 MB) copied, 8.3834 s, 7.8 MB/s

Strontium 16gb 盘读取速度

# sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"

# dd if=./largefile of=/dev/null bs=8k
8000+0 records in
8000+0 records out
65536000 bytes (66 MB) copied, 2.90366 s, 22.6 MB/s

它的读取速度就要比 Sony 的低了。

参考资料


关于 Silver Moon

Php 开发者, 博主 和 Linux 爱好者. 通过 [email protected] 或者 Google+ 可联系到他。

仿真环境下进行 Linux 电源管理子系统测试

Linux 电源管理子系统在仿真环境下提供5种测试方式。这些方式仅仅在内核各层之间运行休眠的代码而不是真正的让系统进入休眠状态。有些平台不能挂起系统,比如说我们需要模拟飞机的飞行环境,这时候使用这种仿真环境就非常有用处了。

freezer - 测试停掉处理器:

echo freezer > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

devices - 测试停掉处理器以及挂起设备:

echo devices > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

platform - 测试停掉处理器、挂起设备以及平台全局控制方法(*)

echo platform > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

processors - 测试停掉处理器、挂起设备和平台全局控制方法(*),以及关闭未启动的 CPU。

echo processors > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

core - 测试停掉处理器、挂起设备和平台全局控制方法(*),关闭未启动的 CPU,以及挂起平台或系统的设备。注意:这个测试模式运行在 ACPI 系统。

echo core > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

Linux 电源管理子系统追踪事件

电源管理子系统在运行过程中支持多种追踪点和追踪事件。我将对如何使用这些追踪时间以及如何找到追踪信息作一个简单的介绍:

在运行时开启电源管理事件:

cd /sys/kernel/debug/tracing/events/power
echo 1 > cpu_frequency/enable
cat /sys/kernel/debug/tracing/set_event
less /sys/kernel/debug/tracing/trace

为内核启动的命令添加一个参数:

trace_event=cpu_frequency

更多信息查看 Documentation/power/basic-pm-debugging.txt 以及同目录下其他的文档。

git bisect 命令

git bisect 是一个非常有用非常强大的工具,用于将 git 上的一个 commit 分离出来。我简单过一遍它的用法。

下面是 git bisect 的用法:

git bisect start
git bisect bad   # 当前版本是坏的
git bisect good v3.14-rc6   # 上个版本是好的

一旦指定好好的版本和坏的版本,git bisect 就会开始把好坏两个版本之间的所有 commit 对半分,并将其中的一半提交 pull 下来。然后重新编译安装测试内核,并标记这个内核是好是坏。重复这个过程,知道某个你选好的 commit 被标记被好或者坏。我们可能需要测试多个内核版本,测到最后一个版本时,git bisect 会将一个 commit 标记为坏。下面的命令可以在 git bisect 分析过程中起到帮助作用:

查看 bisect 操作的过程:

git bisect log

重置 git bisect,标记错误时可以用到,保存 git log 的输出,重新操作上一次 bisect 的步骤:

git bisect reset

重放 git bisect 操作过程:

git bisect replay git_log_output

如果一个问题很清楚是在某个区域内,git bisect 命令可以定位到一个具体的内核源码树枝干上。举个例子,在调试一个镭龙显卡驱动的问题时,为 git bisect 指定 drivers/drm/radeon 参数,可以让 git bisect 只检索对 drivers/drm/radeon 里面的文件有修改的 commit。

让 git bisect 只检索内核树的某个枝干:

git bisect start drivers/drm/radeon

via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,4

译者:bazz2 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

问题:我想要知道PDF文件中使用了什么字体,或者嵌入了什么字体。Linux中有工具可以检查PDF文档中使用了哪种字体吗?

要检查PDF文件中包含了,或者使用了什么字体,你可以使用命令行工具:pdffonts,它是一个PDF字体分析工具。pdffonts是Poppler PDF工具集包中的一个部分。

安装PDF工具集到Linux

要安装Poppler到Debian,Ubuntu或Linux Mint:

$ sudo apt-get install poppler-utils

要安装PDF工具集到Fedora,CentOS或RHEL:

$ sudo yum install poppler-utils

检查PDF字体

pdffonts可以列出PDF文档中使用的所有字体。pdffonts的基本用法如下。

$ pdffonts doc.pdf

pdffonts工具显示了各个已使用的字体的各种信息,如字体名称/类型,或者字体是否内嵌等等。

如果一个PDF文档有多页,你可以使用“-f”(首页)和“-l”(末页)选项来限制字体扫描页面范围。例如,如果你想要找出某个文档中的5-10页中使用了哪种字体,运行该命令:

$ pdffonts -f 5 -l 10 doc.pdf 

via: http://ask.xmodulo.com/check-which-fonts-are-used-pdf-document.html

译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出