Linux 运维笔记

七月 18, 2025 [linux] #ops #perf #debug #tools #troubleshooting

Linux 运维笔记

常用命令行工具

单行命令集

# 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'

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 界面)

关键指标

分析方法

perf c2c report -g 的 TUI 界面中:

  1. 找到 HITM 占比过高的 cacheline
  2. d 进入 Pareto 分布表,查看访问该 cacheline 的代码符号和行号
  3. Enter 查看具体调用栈

优化策略

  1. 将(几乎)只读数据放在一起,减少 cacheline 占用
  2. 分离冷热路径:热路径用线程局部计数器,冷路径做汇总
  3. 数据结构对齐到 cacheline 并填充到整数倍
  4. 减小锁粒度(如 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 设为 pythonargs 为子进程脚本路径。启动后输入 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 报警处理