Linux 速查表
- 版本:Free, Premium, Ultimate
- 产品:GitLab Self-Managed
这是 GitLab 支持团队整理的 Linux 相关信息集合,他们在排查问题时偶尔会用到。我们在此公开这些信息,以示透明,也方便有 Linux 经验的用户参考。如果您当前正遇到 GitLab 问题,在尝试使用本文信息之前,建议您先查看您的支持选项。
协助进行系统管理超出了 GitLab 支持的范围。我们期望 GitLab 管理员了解其所选发行版的这些命令。如果您是 GitLab 支持工程师,可将此文档视为一份交叉参考,用于将 yum 转换为 apt-get 等类似命令。
以下大部分命令未标注其适用的发行版。欢迎贡献内容,帮助我们补充这些信息。
系统命令
发行版信息
# Debian/Ubuntu
uname -a
lsb_release -a
# CentOS/RedHat
cat /etc/centos-release
cat /etc/redhat-release
# 这将提供更多信息
cat /etc/os-release关机或重启
shutdown -h now
reboot权限
# 更改文件/目录的用户:组所有权
chown root:git <file_or_dir>
# 使文件可执行
chmod u+x <file>文件和目录
# 创建一个新目录及其所有子目录
mkdir -p dir/dir2/dir3
# 将命令的输出发送到 file.txt,不在 STDOUT 显示
ls > file.txt
# 将命令的输出发送到 file.txt,同时在 STDOUT 中查看
ls | tee /tmp/file.txt
# 在文件中搜索并替换
sed -i 's/original-text/new-text/g' <filename>查看所有设置的环境变量
env搜索
文件名
# 在文件系统中搜索文件
find . -name 'filename.rb' -print
# 定位文件
locate <filename>
# 查看命令历史
history
# 搜索 CLI 历史记录
<ctrl>-R文件内容
# -B/A = 显示 search_term 前/后各 2 行
grep -B 2 -A 2 search_term <filename>
# -<数字> 同时显示前后的行
grep -2 search_term <filename>
# 在目录中的所有文件中搜索(递归)
grep -r search_term <directory>
# Grep GitLab 仓库的 namespace/project/name
grep 'fullpath' /var/opt/gitlab/git-data/repositories/@hashed/<repo hash>/.git/config
# 搜索 *.gz 文件与此类似,但使用 zgrep
zgrep search_term <filename>
# 快速 grep,打印包含字符串模式的行
fgrep -R string_pattern <filename or directory>命令行界面 (CLI)
# 查看命令历史
history
# 运行最后一个以 'his' 开头的命令(至少 3 个字母)
!his
# 搜索命令历史
<ctrl>-R
# 使用 sudo 执行上一个命令
sudo !!管理资源
内存、磁盘和 CPU 使用率
# 磁盘空间信息。'-h' 以人类可读的格式显示数据
df -h
# 当前目录中每个文件/目录及其内容的大小
du -hd 1
# 或使用替代命令
du -h --max-depth=1
# 查找大于特定大小 (k, M, G) 的文件并按顺序列出
# 去掉 + 表示精确匹配,- 表示小于
find / -type f -size +100M -print0 | xargs -0 du -hs | sort -h
# 查找系统上的可用内存
free -m
# 查找哪些进程正在使用内存/CPU 并按其排序
# 负载平均值是 1、5 和 15 分钟内的 1/CPU
top -o %MEM
top -o %CPUStrace
# 对一个进程进行 strace
strace -tt -T -f -y -yy -s 1024 -p <pid>
# -tt 打印微秒级精度的时间戳
# -T 打印每个系统调用所花费的时间
# -f 同时追踪任何 fork 出的子进程
# -y 打印与文件句柄关联的路径
# -yy 打印套接字和设备文件句柄的详细信息
# -s 为事件打印的最大字符串长度
# -o 输出文件
# 在所有 puma 进程上运行 strace
ps auwx | grep puma | awk '{ print " -p " $2}' | xargs strace -tt -T -f -y -yy -s 1024 -o /tmp/puma.txt请注意,strace 在运行时可能会对系统性能产生重大影响。
Strace 相关资源
- 有关快速入门,请参阅 strace zine。
- Brendan Gregg 提供了关于如何使用 strace的更详细解释。
- 我们有一系列关于使用 strace 理解 GitLab 的 GitLab Unfiltered 视频。
Strace Parser 工具
我们的 strace-parser 工具 可用于提供 strace 输出的高级摘要。它类似于 strace -C,但提供了更详细的统计信息。
MacOS 和 Linux 的二进制文件可供下载,或者如果您有 Rust 编译器,也可以从源代码构建。
如何使用该工具
首先,使用 summary 标志运行该工具,以获取按主动执行任务时间排序的顶级进程摘要。您还可以使用 -s 或 --sort 标志,根据总时间、系统调用次数、PID 号和子进程数进行排序。结果数量默认为 25 个进程,但可以使用 -c/--count 选项进行更改。有关完整详情,请参阅 --help。
$ ./strace-parser sidekiq_trace.txt summary -c15 -s=pid
Top 15 PIDs by PID #
-----------
pid actv (ms) wait (ms) user (ms) total (ms) % of actv syscalls children
------- ---------- ---------- ---------- ---------- --------- --------- ---------
16706 0.000 0.000 0.000 0.000 0.00% 0 0
16708 0.000 0.000 0.000 0.000 0.00% 0 0
16716 0.000 0.000 0.000 0.000 0.00% 0 0
16717 0.000 0.000 0.000 0.000 0.00% 0 0
16718 0.000 0.000 0.000 0.000 0.00% 0 0
16719 0.000 0.000 0.000 0.000 0.00% 0 0
16720 0.389 9796.434 1.090 9797.912 0.02% 16 0
16721 0.000 0.000 0.000 0.000 0.00% 0 0
16722 0.000 0.000 0.000 0.000 0.00% 0 0
16723 0.000 0.000 0.000 0.000 0.00% 0 0
16804 0.218 11099.535 1.881 11101.634 0.01% 36 0
16813 0.000 0.000 0.000 0.000 0.00% 0 0
16814 1.740 11825.640 4.616 11831.996 0.10% 57 0
16815 2.364 12039.993 7.669 12050.026 0.14% 80 0
16816 0.000 0.000 0.000 0.000 0.00% 0 0
PIDs 93
real 0m12.287s
user 0m1.474s
sys 0m1.686s根据摘要,您可以使用 -p/--pid 查看一个或多个进程的系统调用详细信息,或使用 -s/--stats 标志查看排序列表。--stats 接受与 summary 相同的排序和计数选项。
./strace-parser sidekiq_trace.txt p 16815
PID 16815
80 syscalls, active time: 2.364ms, user time: 7.669ms, total time: 12050.026ms
start time: 22:46:14.830267 end time: 22:46:26.880293
syscall count total (ms) max (ms) avg (ms) min (ms) errors
----------------- -------- ---------- ---------- ---------- ---------- --------
futex 5 10100.229 5400.106 2020.046 0.022 ETIMEDOUT: 2
restart_syscall 1 1939.764 1939.764 1939.764 1939.764 ETIMEDOUT: 1
getpid 33 1.020 0.046 0.031 0.018
clock_gettime 14 0.420 0.038 0.030 0.021
stat 6 0.277 0.072 0.046 0.031
read 6 0.170 0.036 0.028 0.020
openat 3 0.126 0.045 0.042 0.038
close 3 0.099 0.034 0.033 0.031
lseek 3 0.089 0.035 0.030 0.021
ioctl 3 0.082 0.033 0.027 0.023 ENOTTY: 3
fstat 3 0.081 0.034 0.027 0.022
---------------
Slowest file open times for PID 16815:
dur (ms) timestamp error filename
---------- --------------- --------------- ---------
0.045 22:46:16.771318 - /opt/gitlab/embedded/service/gitlab-rails/config/database.yml
0.043 22:46:26.877954 - /opt/gitlab/embedded/service/gitlab-rails/config/database.yml
0.038 22:46:22.174610 - /opt/gitlab/embedded/service/gitlab-rails/config/database.yml在上一个示例中,我们可以看到 PID 16815 打开哪些文件花费了更长时间。
当结果中没有明显异常时,一个很好的获取更多上下文的方法是:在您自己的 GitLab 实例上,执行客户所做的操作的同时运行 strace,然后比较两个结果的摘要并深入研究其中的差异。
open 系统调用的统计数据
关于在各种配置上调用 open 和 openat(用于访问文件)的大致数据。缓慢的存储可能导致 Gitaly 中出现令人头疼的 DeadlineExceeded 错误。
此外,请参阅手册中的此条目,了解客户可以执行的快速测试以检查其文件系统性能。
请记住,来自 strace 的时间信息通常有些不准确,因此小的差异不应被视为显著差异。
| 配置 | 访问时间 |
|---|---|
| EFS | 10 - 30 ms |
| Local Storage | 0.01 - 1 ms |
网络
端口
# 查找正在监听端口的程序
netstat -plnt
ss -plnt
lsof -i -P | grep <port>互联网/DNS
# 显示域名 IP 地址
dig +short example.com
nslookup example.com
# 使用特定名称服务器检查 DNS
# 8.8.8.8 = google, 1.1.1.1 = cloudflare, 208.67.222.222 = opendns
dig @8.8.8.8 example.com
nslookup example.com 1.1.1.1
# 查找主机提供商
whois <ip_address> | grep -i "orgname\|netname"
# Curl 头部信息(含重定向)
curl --head --location "https://example.com"
# 测试主机在网络上是否可达。'ping6' 适用于 IPv6 网络。
ping example.com
# 显示到达主机所经过的路由。'traceroute6' 适用于 IPv6 网络。
traceroute example.com
mtr example.com
# 列出网络接口的详细信息
ip address
# 检查本地 DNS 设置
cat /etc/hosts
cat /etc/resolv.conf
systemd-resolve --status
# 捕获往返于主机的流量
sudo tcpdump host www.example.com软件包管理
# Debian/Ubuntu
# 列出软件包
dpkg -l
apt list --installed
# 查找已安装的软件包
dpkg -l | grep <package>
apt list --installed | grep <package>
# 安装软件包
dpkg -i <package_name>.deb
apt-get install <package>
apt install <package>
# CentOS/RedHat
# 安装软件包
yum install <package>
dnf install <package> # RHEL/CentOS 8+
rpm -ivh <package_name>.rpm
# 查找已安装的软件包
rpm -qa | grep <package>日志
# 打印日志文件中的最后 'n' 行
# 'n' 是要打印的行数
tail -n /path/to/log/file