步骤
安装新内核,记住 grub 的序号,修改 grub.conf
将默认内核改成一个正常可用内核,而不是新安装的内核。
新内核启动时加入panic=5,使新内核启动失败后自动重启。
grub下次重启后进入新内核,使新内核仅在下次重启作为默认内核。一旦发生再次重启,就会按照进入 grub.conf 指定的默认内核。
root 权限运行 grub 命令,进入 grub 命令行。在 grub 命令行中运行(假设新内核的序号为 0),savedefault –default=0 –once,输入 quit 以离开 grub 命令行,通过 crontab 设置机器自动重启。
运行 crontab -e,进入 crontab 配置文件,加入一行*/15 * * * * reboot。
重启系统,如果能正常进入新内核,则运行 crontab -e,删除 reboot 的一行。
系统性能分析工具perf
内置于Linux内核源码树中的性能剖析工具。基于事件采样原理以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。常用于性能瓶颈的查找与热点代码的定位。举例:
perf top
# perf top // 默认配置
# perf top -G // 得到调用关系图
# perf top -e cycles // 指定性能事件
# perf top -p 23015,32476 // 查看这两个进程的cpu cycles使用情况
# perf top -s comm,pid,symbol // 显示调用symbol的进程名和进程号
# perf top –comms nginx,top // 仅显示属于指定进程的符号
# perf top –symbols kfree // 仅显示指定的符号
perf stat
执行10次程序,给出标准偏差与期望的比值:
# perf stat -r 10 ls > /dev/null
显示更详细的信息:
# perf stat -v ls > /dev/null
只显示任务执行时间,不显示性能计数器:
# perf stat -n ls > /dev/null
单独给出每个CPU上的信息:
# perf stat -a -A ls > /dev/null
ls命令执行了多少次系统调用:
# perf stat -e syscalls:sys_enter ls
perf record
记录nginx进程的性能数据:
# perf record -p `pgrep -d ‘,’ nginx`
记录执行ls时的性能数据:
# perf record ls -g
记录执行ls时的系统调用,可以知道哪些系统调用最频繁:
# perf record -e syscalls:sys_enter ls
参考:
系统级性能分析工具 — Perf_zhangskd的专栏-CSDN博客_perf top
http://kernel.taobao.org/index.php?title=Documents/Kernel_Perf
火焰图制作工具:
GitHub – brendangregg/FlameGraph: Stack trace visualizer
内核调试技巧
Kdump&Crash 调试技巧
安装Kdump和Crash
yum install kexec-tools
yum install crash
配置Kdump
objdump 应用
常用命令:
objdump -x obj 以某种分类信息的形式把目标文件的数据组织(被分为几大块)输出 <可查到该文件的所有动态库>
objdump -t obj 输出目标文件的符号表()
objdump -h obj 输出目标文件的所有段概括()
objdump -j .text/.data -S obj 输出指定段的信息,大概就是反汇编源代码把
objdump -S obj C语言与汇编语言同时显示
参考:
gcc命令objdump用法
SystemTap
以下介绍 SystemTap 完整环境的配置流程。完整环境即支持从 SystemTap 脚本解析到 SystemTap 运行的完整流程的环境。
安装内核开发包 kernel-devel:
查看当前内核的开发包是否已安装: rpm -q kernel-devel-`uname -r`。
若未安装:如果使用 CentOS 标准内核,则用 yum 安装:yum install kernel-devel。
如果新安装 kernel-devel 与当前运行内核版本不匹配,则还需要更新内核并重启:yum update kernel; reboot。
安装内核调试信息包 kernel-debuginfo(内核态跟踪需要)。
如果是要跟踪用户态程序,而非内核本身,则可略过此步。
查看当前运行内核的调试信息包是否已安装: rpm -q kernel-debuginfo-`uname -r`。
若未安装:
如果使用 CentOS 标准内核,则用 yum 安装:yum install /usr/bin/debuginfo-install; debuginfo-install kernel。
如果新安装 kernel-debuginfo 与当前运行内核版本不匹配,则还需要更新内核并重启:yum update kernel kernel-devel reboot。
安装内核调试源码包 kernel-debuginfo-common内核源码仅为了编写 SystemTap 脚本时作参考之用。
可直接参考 git 仓库中的代码。
查看当前运行内核的调试源码包是否已安装: rpm -q kernel-debuginfo-`uname -m`-`uname -r`
若未安装:
如果使用 CentOS 标准内核,则安装 kernel-debuginfo 时会自动通过依赖安装上对应的 kernel-debuginfo-common内核 debuginfo 包的组织。
内核的 debuginfo 包除了 kernel-debuginfo 外,还有一个 kernel-debuginfo-common-x86_64 (x86_64 为系统架构代号)
kernel-debuginfo: 提供内核及内核模块的调试信息
kernel-debuginfo-common-x86_64: 提供内核源码
使用 SystemTap 进行内核级调试时,需要安装 kernel-debuginfo。kernel-debuginfo-common-x86_64 并不需要,即使使用 kernel.statement 等代码行号级别的 probe 点。 安装 SystemTap
yum install systemtap 运行示例编写简单的 SystemTap 脚本,保存为 who-is-reading.stp 如下
probe syscall.read
{
printf(“[%d] %s\n”, pid(), execname())
}
运行 stap who-is-reading.stp。稍等会就有很多输出。然后按 Ctrl-C 结束。
SystemTap 单纯运行环境
SystemTap 支持在单独设备上先将 SystemTap 脚本编译成 ko 文件。然后在其它设备上,仅需要 staprun 命令就能完成运行,无需在设备上安装 kernel-devel 及 kernel-debuginfo。
安装方法:yum install systemtap-runtime
SystemTap 入门
SystemTap 参考资料:
Systemtap 学习
CentOS 系统上如何安装调试信息包:
- 安装 yum-utils。它提供 debuginfo-install 命令。
- 启用 Debuginfo Yum 源,修改 /etc/yum.repos.d/CentOS-Debuginfo.repo,将 enabled 改为 1
- 安装 debuginfo 包(将 grep 改为你需要的包名,实际上即安装 grep-debuginfo): debuginfo-install grep
- 至此安装完成,可以用 rpm -ql grep-debuginfo 查看实际加入了哪些文件
关于 debuginfo 包
每个带二进制程序的 RPM 包,在打包时,都会产生一个对应的 debuginfo 包,如 grep => grep-debuginfo。
二进制文件通常即为 ELF 为件,如可执行文件(/bin/grep),以及动态库(/lib64/
libc.so
)
debuginfo 包中主要包含两类内容二进制文件的调试信息,即编译过程生成的符号表。
以相同路径安装于 /usr/lib/debug/ 目录下,二进制文件文件名加上 .debug 后缀二进制文件对应的程序源码。
以 rpmbuild 的 BUILD 路径,安装于 /usr/src/debug 下。
Kdump 和 Crash 技术
Netconsole 技术