Linux 运维笔记
七月 18, 2025 [linux] #ops #perf #debug #tools #troubleshootingLinux 运维笔记
常用命令行工具
单行命令集
# bpf 监控 execve 调用
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_execve { printf("%-6d %-8s ", pid, comm); join(args->argv);}'
# 批量格式化 C++ 代码
git ls-files -- '*.cpp' '*.h' | xargs clang-format -i -style=file
# 禁用系统休眠
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
# 键盘映射调整
setxkbmap -option ctrl:ralt_rctrl
grep -e "ctrl:\|:ctrl" /usr/share/X11/xkb/rules/evdev.lst
推荐工具清单
| 类别 | 工具 |
|---|---|
| 文本搜索 | rg (ripgrep), ag, grep |
| Git 浏览 | tig, git |
| JSON 处理 | jq, python -m json.tool |
| 模糊搜索 | fzf |
| 远程连接 | mosh (UDP SSH), autossh |
| 进程监控 | htop, atop, nmon |
| 下载工具 | axel -n 20 <url> |
| 编译缓存 | ccache |
| 命令纠正 | thefuck |
| 剪贴板 | xclip, xsel, wl-copy/wl-paste |
| Shell 美化 | starship |
| 大文件创建 | fallocate -l 100G <file> (秒级创建稀疏文件) |
grep 颜色配置
export GREP_COLORS='ms=01;33:mc=01;31:sl=:cx=:fn=1;96:ln=1;96:bn=1;96:se=1;97'
ms: 匹配文本颜色mc: 非匹配上下文颜色(-v时)fn: 文件名颜色(-H)ln: 行号颜色(-n)
perf c2c:缓存伪共享诊断
伪共享
CPU 缓存以 cacheline(x86-64 为 64 字节)为单位操作。即使变量不被多核共享,只要落在同一 cacheline 上,任一核的写入都会导致其他核的缓存失效,称为伪共享。
使用 perf c2c
perf c2c record -g -u ./your_program # 记录
perf c2c report -g --stats # 统计汇总
perf c2c report -g # 详细报告(TUI 界面)
关键指标
Load LLC Misses:最后一级缓存未命中总数LLC Misses to Remote cache (HITM):从远程 NUMA 拿到脏缓存的比例,这是代价最高的伪共享信号。该值不接近 0 就值得排查- cachelines 按
HITM降序排列,占比异常集中在某几条的即为竞争热点
分析方法
在 perf c2c report -g 的 TUI 界面中:
- 找到
HITM占比过高的 cacheline - 按
d进入 Pareto 分布表,查看访问该 cacheline 的代码符号和行号 - 按
Enter查看具体调用栈
优化策略
- 将(几乎)只读数据放在一起,减少 cacheline 占用
- 分离冷热路径:热路径用线程局部计数器,冷路径做汇总
- 数据结构对齐到 cacheline 并填充到整数倍
- 减小锁粒度(如 concurrent hash map 的分段锁)
进阶参数
# 提高采样频率(生产环境慎用)
echo 100000 > /proc/sys/kernel/perf_event_max_sample_rate
# 提高延迟阈值过滤
perf c2c record -u -l 50 -- -a -g sleep 10
# 采样时间不宜过长(3-10秒),否则观测到的是时间错开的访问
ptrace / ltrace / strace
ltrace 不输出问题
Ubuntu 22 中 ltrace 对 PIE 可执行文件不输出,需重新编译:
gcc -no-pie test.c -o test
ltrace ./test
strace 源码调试
apt source strace
cd strace-*
dpkg-buildpackage -b -uc -us
子进程信号处理
ptrace 追踪子进程时,子进程会收到 SIGSTOP。应忽略第一次 SIGSTOP,否则子进程异常结束;但也不能忽略所有信号,否则无 SIGCHLD 会导致僵尸进程。
通过 ptrace 修改子进程参数
在 execve 系统调用时,检查 argv[0] 匹配 gcc/g++/clang/clang++,可以使用栈内存重建 char** 向量替换编译器路径,实现编译器拦截。
ibus libpinyin 输入法
启用 "记住输入" 功能:
gsettings set com.github.libpinyin.ibus-libpinyin.libpinyin remember-every-input true
ibus restart
排查工具:
ibus engine # 查看当前引擎
db_dump ~/.cache/ibus/libpinyin/user_bigram.db | head # 查看用户词组
用户词组存储在 Berkeley DB (BDB) 格式的 user_bigram.db 中。BDB 是键值存储数据库,不支持 SQL,专为高性能读写设计。
字体安装
wget -c https://github.com/ryanoasis/nerd-fonts/releases/download/v2.0.0/SourceCodePro.zip
sudo unzip SourceCodePro -d /usr/share/fonts/SourceCodePro
sudo mkfontscale && sudo mkfontdir && sudo fc-cache -fv
VSCode 附加 GDB 调试 Python 子进程
在 launch.json 中配置 C++ (GDB/LLDB) 类型,program 设为 python,args 为子进程脚本路径。启动后输入 set follow-fork-mode child 即可附加到子进程。
常见问题速查
| 问题 | 解决 |
|---|---|
| Docker 安装 GPG 报错 | 检查网络代理,确认 key 服务器可达 |
usermod -aG docker 不生效 | 注销后重新登录 |
find -size -1M 只匹配空文件 | -size -1M 是整数比较,0M 以下为 0。改用 -size -1000k |
| FRP 配置不通 | 检查云服务商安全组和 VPS 防火墙 (systemctl stop firewalld) |
| WireGuard 握手失败 | 关闭防火墙验证,之后配置端口放行 |
| GitLab CI SSH 超时 | 在 /etc/ssh/ssh_config 添加 ServerAliveInterval 60 |
zsh no matches found | 含通配符的参数加引号 |
zsh 不加载 .zshrc | 内容放入 ~/.zshenv 或在 ~/.zshenv 中 source |
| cmake 外部依赖未更新 | 删除 build 目录中的 --prefix 对应路径 |
cmake --build 行为异常 | 检查 cmake 是否被 alias:which cmake |
GCC 报警处理
ISO C++11 requires at least one argument for the "..." in a variadic macro:由-pedantic检查,可变宏参数为空时触发relocation truncated to fit: R_MIPS_GOT_DISP:MIPS 架构上符号地址超出重定位位数限制,通常因.so太大导致,需拆分符号或改用其他重定位方式