引言:为什么需要系统问题排查技能

Debian作为一款稳定、安全的Linux发行版,广泛应用于服务器、桌面和嵌入式系统中。然而,即使是再稳定的系统,也难免会遇到各种问题,如服务无法启动、性能下降、网络连接异常等。掌握系统问题排查技巧,不仅能帮助你快速定位和解决问题,还能让你更深入地理解系统的工作原理。

本文将从日志分析入手,逐步深入到性能调优,涵盖Debian系统中常见的排查工具和方法。无论你是系统管理员、开发人员还是普通用户,都能从中获得实用的知识和技巧。

第一部分:日志分析——系统问题的“黑匣子”

日志是系统问题排查的第一站,它记录了系统运行过程中的各种事件和错误信息。Debian系统使用systemd作为初始化系统,其日志管理工具journalctl成为了分析日志的核心工具。

1.1 journalctl基础用法

journalctl是systemd的日志管理工具,可以查看系统日志、服务日志等。以下是一些常用命令:

  • 查看所有日志journalctl(默认显示所有日志,从旧到新)
  • 查看本次启动以来的日志journalctl -b
  • 查看指定服务的日志journalctl -u nginx.service
  • 实时跟踪日志journalctl -f(类似tail -f
  • 按时间过滤日志journalctl --since "2023-10-01 00:00:00" --until "2023-10-01 23:59:59"

1.2 高级日志过滤技巧

journalctl支持强大的过滤功能,可以帮助我们快速定位问题。

  • 按优先级过滤journalctl -p err(只显示错误及以上级别的日志)
    • 优先级从低到高:debug, info, notice, warning, err, crit, alert, emerg
  • 按进程ID过滤journalctl _PID=1234
  • 按可执行文件路径过滤journalctl _EXE=/usr/sbin/nginx
  • 组合过滤journalctl -u nginx.service -p err --since "1 hour ago"

1.3 日志持久化配置

默认情况下,journal日志存储在内存中,重启后会丢失。为了长期分析日志,需要配置持久化存储。

编辑/etc/systemd/journald.conf文件,取消以下行的注释并修改:

[Journal] Storage=persistent Compress=yes SystemMaxUse=1G 

重启journal服务:

sudo systemctl restart systemd-journald 

1.4 实战案例:排查Nginx无法启动的问题

假设你安装了Nginx,但服务无法启动,以下是排查步骤:

  1. 查看服务状态

    sudo systemctl status nginx.service 

    输出可能显示”Failed to start A high performance web server and a reverse proxy server.”

  2. 查看详细日志

    sudo journalctl -u nginx.service -e 

    -e参数表示跳转到日志末尾,方便查看最新信息。

  3. 假设日志显示

    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: configuration file /etc/nginx/nginx.conf test failed 

    这表明80端口已被占用。

  4. 查找占用80端口的进程

    sudo ss -tlnp | grep :80 

    或者:

    sudo lsof -i :80 
  5. 解决问题

    • 如果是Apache占用了端口,可以停止Apache:sudo systemctl stop apache2
    • 或者修改Nginx配置,使用其他端口。

第二部分:系统性能分析——找出瓶颈所在

当系统出现响应缓慢、资源耗尽等问题时,需要使用性能分析工具来找出瓶颈。Debian提供了丰富的性能分析工具,如top、htop、vmstat、iostat等。

2.1 实时监控工具

top命令

top是Linux下经典的实时监控工具,显示系统整体资源使用情况。

top 

输出解读:

  • 第一行:系统运行时间、用户数、负载均衡(1分钟、5分钟、15分钟)
  • 第二行:进程总数、运行中、休眠、停止、僵尸进程
  • 第三行:CPU使用率(us用户空间、sy内核空间、ni nice值、id空闲、wa等待IO、hi硬中断、si软中断、st steal time)
  • 第四行:内存使用(total、free、used、buff/cache)
  • 第五行:交换空间使用(swap)
  • 进程列表:PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND

htop命令

htop是top的增强版,支持鼠标操作,颜色显示,更直观。

安装htop:

sudo apt update sudo apt install htop 

运行:

htop 

功能:

  • F1帮助、F2设置、F3搜索、F4过滤、F5树状视图、F6排序、F7调整nice值、F8调整优先级、F9杀死进程、F10退出

2.2 进程和线程分析

ps命令

ps用于显示当前进程的状态。

常用选项:

  • ps aux:显示所有进程的详细信息
  • ps -ef:显示所有进程的完整格式
  • ps -L <PID>:显示指定进程的线程

示例:查找nginx进程

ps aux | grep nginx 

pstree命令

以树状结构显示进程关系,便于理解父子进程关系。

pstree -p 

3.3 内存分析工具

free命令

显示内存和交换空间的使用情况。

free -h # -h表示以人类可读的格式显示(GB、MB) 

输出示例:

 total used free shared buff/cache available Mem: 7.7Gi 1.2Gi 4.8Gi 10Mi 1.7Gi 6.1Gi Swap: 2.0Gi 0B 2.0Gi 

注意:available列显示的是可用内存(包括buff/cache中可回收的部分)。

vmstat命令

虚拟内存统计工具,可以显示进程、内存、IO、CPU等信息。

vmstat 1 5 # 每秒输出1次,共输出5次 

输出字段含义:

  • procs:r(运行队列)、b(阻塞)
  • memory:swpd(虚拟内存使用)、free(空闲内存)、buff(缓冲区)、cache(缓存)
  • swap:si(换入)、so(换出)
  • io:bi(块设备读)、bo(块设备写)
  • system:in(中断)、cs(上下文切换)
  • cpu:us(用户)、sy(系统)、id(空闲)、wa(等待IO)、st( steal)

2.4 磁盘I/O分析

iostat命令

磁盘I/O统计工具,需要安装sysstat包。

安装:

sudo apt install sysstat 

使用:

iostat -x 1 5 # 显示扩展统计,每秒1次,共5次 

输出字段:

  • %util:设备利用率(接近100%表示磁盘繁忙)
  • await:平均I/O等待时间(毫秒)
  • r/s:每秒读次数
  • w/s:每秒写次数

iotop命令

实时显示磁盘I/O使用情况,类似top命令。

安装:

sudo apt install iotop 

使用:

sudo iotop 

2.5 网络分析工具

ss命令

socket统计工具,比netstat更快速、更高效。

常用选项:

  • ss -tlnp:显示所有TCP监听端口和进程
  • ss -s:显示摘要统计
  • ss -t state established:显示已建立的TCP连接

示例:查看占用80端口的进程

sudo ss -tlnp | grep :80 

iftop命令

实时显示网络带宽使用情况(按主机对)。

安装:

sudo apt install iftop 

使用:

sudo iftop -i eth0 # 指定网卡 

2.6 系统调用追踪

strace命令

跟踪进程的系统调用和信号,用于调试程序。

安装:

sudo apt install strace 

使用:

strace -p <PID> # 附加到运行中的进程 strace ls # 跟踪命令执行 

示例:追踪nginx启动过程

strace -f -o /tmp/nginx.strace /usr/sbin/nginx -t 

其中-f表示跟踪子进程,-o输出到文件,-t显示时间戳。

ltrace命令

跟踪进程的库函数调用。

安装:

sudo apt install ltrace 

使用:

ltrace -p <PID> 

2.7 性能分析实战案例:解决CPU占用过高问题

假设你的Debian服务器CPU占用率持续90%以上,以下是排查步骤:

  1. 使用top或htop找出占用CPU最高的进程

    htop 

    按F6选择按CPU%排序,发现是一个名为”python3”的进程占用了95%的CPU。

  2. 查看该进程的详细信息

    ps -ef | grep python3 

    假设进程ID是1234,执行路径是/usr/local/bin/myapp.py

  3. 查看该进程的线程占用情况

    ps -T -p 1234 

    发现多个线程都在占用CPU。

  4. 使用strace追踪系统调用

    sudo strace -p 1234 -c 

    运行一段时间后按Ctrl+C,查看统计信息,发现大量pollselect调用,可能是在忙等待。

  5. 查看进程打开的文件和网络连接

    lsof -p 1234 ss -tunap | grep 1234 

    发现进程在不断尝试连接某个外部API,但连接失败。

  6. 分析代码或日志: 查看应用程序日志,发现是API密钥错误导致不断重试。

  7. 解决问题

    • 修复API密钥配置
    • 或者在代码中添加重试间隔和错误处理
    • 临时终止进程:sudo kill 1234

第三部分:网络问题排查

网络问题是服务器运维中最常见的问题之一。Debian提供了丰富的网络排查工具。

3.1 基础网络诊断

ping命令

测试网络连通性。

ping -c 4 google.com # -c指定次数 

traceroute命令

显示数据包到目标主机的路径。

安装:

sudo apt install traceroute 

使用:

traceroute google.com 

mtr命令

结合ping和traceroute的实时网络诊断工具。

安装:

sudo apt install mtr 

使用:

sudo mtr -r -c 10 google.com # -r报告模式,-c次数 

3.2 DNS问题排查

nslookup/dig命令

查询DNS记录。

安装dig:

sudo apt install dnsutils 

使用:

dig google.com dig @8.8.8.8 google.com # 指定DNS服务器 

检查本地DNS配置

查看/etc/resolv.conf

cat /etc/resolv.conf 

3.3 网络连接分析

netstat命令(已过时,推荐ss)

显示网络连接、路由表、接口统计等。

netstat -tunap # 显示TCP/UDP连接、数字格式、所有进程 

ss命令(推荐)

更现代的socket统计工具。

ss -tunap # 显示TCP/UDP连接、数字格式、所有进程 

lsof命令

列出打开的文件(包括网络套接字)。

lsof -i # 显示所有网络连接 lsof -i :80 # 显示占用80端口的进程 

3.4 网络流量分析

tcpdump命令

网络抓包工具。

安装:

sudo apt install tcpdump 

使用:

sudo tcpdump -i eth0 -n # -i指定网卡,-n不解析主机名 sudo tcpdump -i eth0 port 80 # 只捕获80端口流量 sudo tcpdump -i eth0 -w capture.pcap # 保存到文件 

Wireshark图形界面

安装:

sudo apt install wireshark 

使用图形界面分析pcap文件。

3.5 网络配置检查

检查IP配置

ip addr show ifconfig # 需要安装net-tools 

棔查路由表

ip route show route -n # 数字格式 

检查防火墙规则

Debian默认使用iptables或nftables。

查看iptables规则:

sudo iptables -L -n -v 

查看nftables规则:

sudo nft list ruleset 

3.6 网络问题排查实战案例:无法访问外部网站

假设你的Debian服务器无法访问外部网站,以下是排查步骤:

  1. 检查本地网络连通性

    ping 127.0.0.1 # 本地回环 ping <本机IP> # 本机IP ping <网关IP> # 网关IP 

    如果网关无法ping通,检查网络配置或物理连接。

  2. 检查DNS解析

    nslookup google.com 

    如果无法解析,检查/etc/resolv.conf中的DNS服务器配置。

  3. 检查路由

    ip route show 

    确保有默认路由指向网关。

  4. 检查防火墙

    sudo iptables -L -n -v 

    确保没有阻止出站流量的规则。

  5. 检查网络接口状态

    ip link show 

    确保接口是UP状态。

  6. 使用traceroute跟踪路径

    traceroute 8.8.8.8 

    如果在第一跳就失败,说明是本地网络问题;如果在后续跳失败,可能是ISP或中间网络问题。

  7. 检查系统日志

    journalctl -u NetworkManager # 如果使用NetworkManager journalctl -u networking # 如果使用ifupdown 

第四部分:存储问题排查

存储问题包括磁盘空间不足、文件系统损坏、I/O性能下降等。

4.1 磁盘空间分析

df命令

显示文件系统磁盘空间使用情况。

df -h # 人类可读格式 df -i # 显示inode使用情况 

du命令

显示目录或文件的磁盘使用情况。

du -sh /var/* # 显示/var下各目录的大小 du -h --max-depth=1 /var # 显示/var下一级目录的大小 

查找大文件

find / -type f -size +100M -exec ls -lh {} ; # 查找大于100MB的文件 

4.2 文件系统检查

fsck命令

检查和修复文件系统。

注意:在检查文件系统前,必须先卸载该文件系统,或者在救援模式下进行。

sudo umount /dev/sda1 # 卸载分区 sudo fsck /dev/sda1 # 检查分区 

tune2fs命令

调整ext2/ext3/ext4文件系统参数。

sudo tune2fs -l /dev/sda1 # 显示文件系统信息 sudo tune2fs -c 50 /dev/sda1 # 设置强制检查间隔(挂载次数) 

4.3 磁盘I/O性能问题

使用iostat分析

iostat -x 1 5 

如果%util接近100%,说明磁盘I/O是瓶颈。

使用iotop找出I/O高的进程

sudo iotop 

使用lsof找出打开大量文件的进程

sudo lsof | awk '{print $1}' | sort | uniq -c | sort -rn | head 

4.4 存储问题排查实战案例:磁盘空间不足

假设/var分区空间不足,导致服务无法写入日志。

  1. 检查磁盘使用情况

    df -h /var 

    输出显示/var使用率100%。

  2. 查找大文件

    du -sh /var/* | sort -rh | head -n 10 

    发现/var/log占用了大部分空间。

  3. 进一步查找大日志文件

    find /var/log -type f -size +100M -exec ls -lh {} ; 

    发现/var/log/journal/journal.log有2GB。

  4. 分析日志文件

    journalctl --disk-usage # 查看journal日志占用 

    发现journal日志过多。

  5. 清理日志

    • 方法1:清理旧的日志
       journalctl --vacuum-time=7d # 保留最近7天的日志 journalctl --vacuum-size=500M # 保留最多500MB日志 
    • 方法2:手动删除(不推荐,可能破坏日志完整性)
       sudo rm /var/log/journal/*.journal 
  6. 调整日志配置: 编辑/etc/systemd/journald.conf,设置:

    SystemMaxUse=500M MaxFileSec=7day 
  7. 重启服务

    sudo systemctl restart systemd-journald 
  8. 预防措施

    • 设置日志轮转(logrotate)
    • 监控磁盘空间(使用监控工具如Nagios、Prometheus)
    • 定期清理旧日志

第五部分:系统服务管理与故障排查

Debian使用systemd管理服务,服务无法启动是常见问题。

5.1 systemd服务基础

查看服务状态

sudo systemctl status <service-name> 

启动/停止/重启服务

sudo systemctl start <service-name> sudo systemctl stop <service-name> sudo systemctl restart <service-name> 

设置开机自启

sudo systemctl enable <service-name> 

查看服务日志

sudo journalctl -u <service-name> 

5.2 服务配置文件

服务文件位置

systemd服务文件通常位于:

  • /etc/systemd/system/(用户自定义)
  • /lib/systemd/system/(系统默认)

查看服务配置

sudo systemctl cat <service-name> 

修改服务配置

  1. 编辑服务文件:sudo systemctl edit <service-name>(会创建覆盖文件)
  2. 重载配置:sudo systemctl daemon-reload
  3. 重启服务:sudo systemctl restart <service-name>

5.3 服务故障排查步骤

  1. 查看服务状态

    sudo systemctl status <service-name> 

    查看是否有错误信息。

  2. 查看详细日志

    sudo journalctl -u <service-name> -e 
  3. 检查服务依赖

    systemctl list-dependencies <service-name> 
  4. 检查服务配置

    sudo systemctl cat <service-name> 

    检查ExecStart、WorkingDirectory、User等配置是否正确。

  5. 手动执行命令: 复制服务配置中的ExecStart命令,手动执行,查看错误信息。

  6. 检查权限

    • 文件权限:ls -l <executable>
    • 用户权限:id <user>
    • SELinux/AppArmor:sudo aa-status(检查AppArmor状态)

5.4 服务故障排查实战案例:Apache无法启动

假设Apache服务无法启动,以下是排查步骤:

  1. 查看服务状态

    sudo systemctl status apache2.service 

    显示”Failed to start The Apache HTTP Server.”

  2. 查看详细日志

    sudo journalctl -u apache2.service -e 

    日志显示”AH00558: apache2: Could not reliably determine the server’s fully qualified domain name”

  3. 检查配置文件

    sudo apache2ctl configtest 

    输出”Syntax OK”,说明配置语法正确。

  4. 手动启动Apache

    sudo apache2ctl start 

    输出”Address already in use: AH00072: make_sock: could not bind to address [::]:80”

  5. 检查端口占用

    sudo ss -tlnp | grep :80 

    发现Nginx占用了80端口。

  6. 解决问题

    • 停止Nginx:sudo systemctl stop nginx
    • 或者修改Apache配置,使用其他端口。

第六部分:性能调优——让系统跑得更快

性能调优是一个系统工程,需要根据具体场景进行。以下是一些通用的调优方法。

6.1 内核参数调优

sysctl命令

动态修改内核参数。

sudo sysctl -a # 查看所有参数 sudo sysctl -w net.ipv4.ip_forward=1 # 临时修改 

永久修改:编辑/etc/sysctl.conf/etc/sysctl.d/下的文件,然后执行sudo sysctl -p

常用调优参数

网络性能

# 增加TCP连接队列大小 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 # TIME_WAIT连接重用 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0 # 在NAT环境下可能导致问题 # 增加端口范围 net.ipv4.ip_local_port_range = 1024 65535 # 增加文件描述符限制 fs.file-max = 2097152 

内存性能

# 优化内存回收策略 vm.swappiness = 10 # 减少swap使用倾向 vm.dirty_ratio = 15 # 系统内存中脏页占比达到15%时,开始同步写回磁盘 vm.dirty_background_ratio = 5 # 系统内存中脏页占比达到5%时,后台开始写回磁盘 

6.2 文件系统调优

mount选项

编辑/etc/fstab,优化挂载选项。

# 示例:优化SSD上的ext4文件系统 /dev/sda1 / ext4 defaults,noatime,nodiratime,discard 0 1 
  • noatime:不更新访问时间,减少写操作
  • nodiratime:不更新目录访问时间
  • discard:支持SSD的TRIM功能

调整I/O调度器

对于SSD,推荐使用noop或none(内核5.0+)。

# 查看当前调度器 cat /sys/block/sda/queue/scheduler # 临时修改 echo noop > /sys/block/sda/queue/scheduler # 永久修改(使用udev规则) echo 'ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"' | sudo tee /etc/udev/rules.d/60-ssd-scheduler.rules 

6.3 进程和资源限制

ulimit命令

查看和设置用户进程资源限制。

ulimit -a # 查看所有限制 ulimit -n 65535 # 临时设置文件描述符限制 

永久修改:编辑/etc/security/limits.conf

* soft nofile 65535 * hard nofile 65535 

cgroups(控制组)

cgroups可以限制、记录和隔离进程组的资源使用。

安装cgroup-tools:

sudo apt install cgroup-tools 

创建cgroup并限制CPU使用:

sudo cgcreate -g cpu:/myapp sudo cgset -r cpu.cfs_quota_us=50000 myapp # 限制使用50% CPU sudo cgexec -g cpu:myapp /usr/local/bin/myapp 

6.4 数据库性能调优(以MySQL为例)

MySQL配置文件

编辑/etc/mysql/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf

关键参数

[mysqld] # 内存相关 innodb_buffer_pool_size = 4G # 设置为系统内存的50-70% innodb_log_file_size = 512M innodb_flush_log_at_trx_commit = 2 # 平衡性能和数据安全 # 连接相关 max_connections = 500 thread_cache_size = 50 # 查询缓存(MySQL 5.7及以下) query_cache_type = 1 query_cache_size = 128M 

查看MySQL性能指标

-- 查看慢查询 SHOW VARIABLES LIKE 'slow_query_log%'; SHOW VARIABLES LIKE 'long_query_time'; -- 查看InnoDB状态 SHOW ENGINE INNODB STATUS; 

6.5 Web服务器性能调优(以Nginx为例)

Nginx配置文件优化

编辑/etc/nginx/nginx.conf或站点配置文件。

worker_processes auto; # 自动设置为CPU核心数 worker_connections 2048; # 每个worker进程的最大连接数 worker_rlimit_nofile 65535; # worker进程可打开的文件描述符限制 events { use epoll; # 高效的事件模型 worker_connections 2048; } http { sendfile on; # 启用sendfile,减少内核态和用户态之间的数据拷贝 tcp_nopush on; # 在一个包中发送响应头和文件内容 tcp_nodelay on; # 禁用Nagle算法,减少延迟 keepalive_timeout 65; # 保持连接超时时间 keepalive_requests 100; # 每个连接的最大请求数 # 缓存配置 open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; # Gzip压缩 gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; } 

调整系统参数配合Nginx

# 增加端口范围 net.ipv4.ip_local_port_range = 1024 65535 # TIME_WAIT重用 net.ipv4.tcp_tw_reuse = 1 # 增加TCP队列 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 

6.6 性能调优实战案例:优化Web服务器响应时间

假设你的Nginx服务器响应时间较长,以下是优化步骤:

  1. 分析当前性能

    sudo nginx -T # 检查配置 sudo systemctl status nginx sudo journalctl -u nginx -e 
  2. 使用ab(Apache Bench)测试

    sudo apt install apache2-utils ab -n 1000 -c 100 http://your-server/ 

    查看Requests per second(吞吐量)和Time per request(响应时间)。

  3. 检查系统资源

    htop iostat -x 1 

    发现CPU使用率不高,但磁盘I/O等待较高。

  4. 优化Nginx配置

    • 启用sendfile:sendfile on;
    • 启用gzip压缩:gzip on;
    • 调整worker_connections:worker_connections 2048;
  5. 优化内核参数

    sudo sysctl -w net.core.somaxconn=65535 sudo sysctl -w net.ipv4.tcp_tw_reuse=1 
  6. 优化文件系统: 如果使用SSD,确保挂载选项包含noatimediscard

  7. 重新测试: 再次使用ab测试,观察吞吐量和响应时间是否改善。

  8. 监控生产环境: 使用监控工具(如Prometheus+Grafana)持续监控性能指标。

第七部分:综合案例——解决复杂系统问题

案例:系统随机卡顿,响应缓慢

问题描述:Debian服务器在运行一段时间后,系统随机卡顿,SSH登录缓慢,服务响应超时。

排查步骤

  1. 初步检查

    uptime # 查看负载 free -h # 查看内存 df -h # 查看磁盘空间 

    发现负载较高(load average: 5.23, 4.15, 3.87),内存使用率90%,swap使用2GB。

  2. 详细分析

    htop # 查看进程 

    发现多个java进程占用大量内存,且swap使用频繁。

  3. 检查内存使用

    sudo vmstat 1 5 

    观察到si(换入)和so(换出)值较高,说明内存不足,频繁swap。

  4. 找出内存泄漏进程

    sudo smem -s swap # 按swap使用排序 

    发现一个Java应用占用了大量swap。

  5. 分析Java应用

    • 查看Java应用日志
    • 使用jstat查看GC情况:
       jstat -gcutil <pid> 1000 5 
    • 发现Full GC频繁,内存回收效率低。
  6. 解决问题

    • 临时方案:重启Java应用释放内存
       sudo systemctl restart my-java-app 
    • 长期方案
      • 调整JVM参数,增加堆内存:
      -Xmx2g -Xms2g # 设置最大和初始堆内存为2GB 
      • 优化应用代码,减少内存泄漏
      • 增加物理内存
  7. 预防措施

    • 设置内存监控告警
    • 定期分析应用性能
    • 使用cgroups限制进程资源

第八部分:常用排查工具速查表

工具用途常用命令
journalctl查看系统日志journalctl -u <service> -e
top/htop实时进程监控htop
ps显示进程状态ps aux
vmstat虚拟内存统计vmstat 1 5
iostat磁盘I/O统计iostat -x 1 5
iotop实时磁盘I/Osudo iotop
ss网络连接统计ss -tunap
lsof打开文件列表lsof -i :80
strace系统调用追踪strace -p <PID>
tcpdump网络抓包sudo tcpdump -i eth0
df磁盘空间df -h
du目录大小du -sh /var/*
find查找文件find / -size +100M
sysctl内核参数sysctl -a
free内存使用free -h

结论

Debian系统问题排查是一个系统工程,需要结合日志分析、性能监控、网络诊断等多种手段。掌握这些工具和方法,可以帮助你快速定位和解决问题。记住,排查问题的关键在于:

  1. 从现象出发:明确问题表现
  2. 由表及里:从系统整体到具体进程
  3. 数据说话:使用工具获取客观数据
  4. 假设验证:提出假设并验证
  5. 根因分析:找到问题的根本原因
  6. 解决预防:解决问题并制定预防措施

希望本文能帮助你成为Debian系统排查高手!在实际工作中,不断实践和总结,你会越来越熟练。# Debian系统问题排查技巧:从日志分析到性能调优的实战指南

引言:为什么需要系统问题排查技能

Debian作为一款稳定、安全的Linux发行版,广泛应用于服务器、桌面和嵌入式系统中。然而,即使是再稳定的系统,也难免会遇到各种问题,如服务无法启动、性能下降、网络连接异常等。掌握系统问题排查技巧,不仅能帮助你快速定位和解决问题,还能让你更深入地理解系统的工作原理。

本文将从日志分析入手,逐步深入到性能调优,涵盖Debian系统中常见的排查工具和方法。无论你是系统管理员、开发人员还是普通用户,都能从中获得实用的知识和技巧。

第一部分:日志分析——系统问题的“黑匣子”

日志是系统问题排查的第一站,它记录了系统运行过程中的各种事件和错误信息。Debian系统使用systemd作为初始化系统,其日志管理工具journalctl成为了分析日志的核心工具。

1.1 journalctl基础用法

journalctl是systemd的日志管理工具,可以查看系统日志、服务日志等。以下是一些常用命令:

  • 查看所有日志journalctl(默认显示所有日志,从旧到新)
  • 查看本次启动以来的日志journalctl -b
  • 查看指定服务的日志journalctl -u nginx.service
  • 实时跟踪日志journalctl -f(类似tail -f
  • 按时间过滤日志journalctl --since "2023-10-01 00:00:00" --until "2023-10-01 23:59:59"

1.2 高级日志过滤技巧

journalctl支持强大的过滤功能,可以帮助我们快速定位问题。

  • 按优先级过滤journalctl -p err(只显示错误及以上级别的日志)
    • 优先级从低到高:debug, info, notice, warning, err, crit, alert, emerg
  • 按进程ID过滤journalctl _PID=1234
  • 按可执行文件路径过滤journalctl _EXE=/usr/sbin/nginx
  • 组合过滤journalctl -u nginx.service -p err --since "1 hour ago"

1.3 日志持久化配置

默认情况下,journal日志存储在内存中,重启后会丢失。为了长期分析日志,需要配置持久化存储。

编辑/etc/systemd/journald.conf文件,取消以下行的注释并修改:

[Journal] Storage=persistent Compress=yes SystemMaxUse=1G 

重启journal服务:

sudo systemctl restart systemd-journald 

1.4 实战案例:排查Nginx无法启动的问题

假设你安装了Nginx,但服务无法启动,以下是排查步骤:

  1. 查看服务状态

    sudo systemctl status nginx.service 

    输出可能显示”Failed to start A high performance web server and a reverse proxy server.”

  2. 查看详细日志

    sudo journalctl -u nginx.service -e 

    -e参数表示跳转到日志末尾,方便查看最新信息。

  3. 假设日志显示

    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: configuration file /etc/nginx/nginx.conf test failed 

    这表明80端口已被占用。

  4. 查找占用80端口的进程

    sudo ss -tlnp | grep :80 

    或者:

    sudo lsof -i :80 
  5. 解决问题

    • 如果是Apache占用了端口,可以停止Apache:sudo systemctl stop apache2
    • 或者修改Nginx配置,使用其他端口。

第二部分:系统性能分析——找出瓶颈所在

当系统出现响应缓慢、资源耗尽等问题时,需要使用性能分析工具来找出瓶颈。Debian提供了丰富的性能分析工具,如top、htop、vmstat、iostat等。

2.1 实时监控工具

top命令

top是Linux下经典的实时监控工具,显示系统整体资源使用情况。

top 

输出解读:

  • 第一行:系统运行时间、用户数、负载均衡(1分钟、5分钟、15分钟)
  • 第二行:进程总数、运行中、休眠、停止、僵尸进程
  • 第三行:CPU使用率(us用户空间、sy内核空间、ni nice值、id空闲、wa等待IO、hi硬中断、si软中断、st steal time)
  • 第四行:内存使用(total、free、used、buff/cache)
  • 第五行:交换空间使用(swap)
  • 进程列表:PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND

htop命令

htop是top的增强版,支持鼠标操作,颜色显示,更直观。

安装htop:

sudo apt update sudo apt install htop 

运行:

htop 

功能:

  • F1帮助、F2设置、F3搜索、F4过滤、F5树状视图、F6排序、F7调整nice值、F8调整优先级、F9杀死进程、F10退出

2.2 进程和线程分析

ps命令

ps用于显示当前进程的状态。

常用选项:

  • ps aux:显示所有进程的详细信息
  • ps -ef:显示所有进程的完整格式
  • ps -L <PID>:显示指定进程的线程

示例:查找nginx进程

ps aux | grep nginx 

pstree命令

以树状结构显示进程关系,便于理解父子进程关系。

pstree -p 

2.3 内存分析工具

free命令

显示内存和交换空间的使用情况。

free -h # -h表示以人类可读的格式显示(GB、MB) 

输出示例:

 total used free shared buff/cache available Mem: 7.7Gi 1.2Gi 4.8Gi 10Mi 1.7Gi 6.1Gi Swap: 2.0Gi 0B 2.0Gi 

注意:available列显示的是可用内存(包括buff/cache中可回收的部分)。

vmstat命令

虚拟内存统计工具,可以显示进程、内存、IO、CPU等信息。

vmstat 1 5 # 每秒输出1次,共输出5次 

输出字段含义:

  • procs:r(运行队列)、b(阻塞)
  • memory:swpd(虚拟内存使用)、free(空闲内存)、buff(缓冲区)、cache(缓存)
  • swap:si(换入)、so(换出)
  • io:bi(块设备读)、bo(块设备写)
  • system:in(中断)、cs(上下文切换)
  • cpu:us(用户)、sy(系统)、id(空闲)、wa(等待IO)、st( steal)

2.4 磁盘I/O分析

iostat命令

磁盘I/O统计工具,需要安装sysstat包。

安装:

sudo apt install sysstat 

使用:

iostat -x 1 5 # 显示扩展统计,每秒1次,共5次 

输出字段:

  • %util:设备利用率(接近100%表示磁盘繁忙)
  • await:平均I/O等待时间(毫秒)
  • r/s:每秒读次数
  • w/s:每秒写次数

iotop命令

实时显示磁盘I/O使用情况,类似top命令。

安装:

sudo apt install iotop 

使用:

sudo iotop 

2.5 网络分析工具

ss命令

socket统计工具,比netstat更快速、更高效。

常用选项:

  • ss -tlnp:显示所有TCP监听端口和进程
  • ss -s:显示摘要统计
  • ss -t state established:显示已建立的TCP连接

示例:查看占用80端口的进程

sudo ss -tlnp | grep :80 

iftop命令

实时显示网络带宽使用情况(按主机对)。

安装:

sudo apt install iftop 

使用:

sudo iftop -i eth0 # 指定网卡 

2.6 系统调用追踪

strace命令

跟踪进程的系统调用和信号,用于调试程序。

安装:

sudo apt install strace 

使用:

strace -p <PID> # 附加到运行中的进程 strace ls # 跟踪命令执行 

示例:追踪nginx启动过程

strace -f -o /tmp/nginx.strace /usr/sbin/nginx -t 

其中-f表示跟踪子进程,-o输出到文件,-t显示时间戳。

ltrace命令

跟踪进程的库函数调用。

安装:

sudo apt install ltrace 

使用:

ltrace -p <PID> 

2.7 性能分析实战案例:解决CPU占用过高问题

假设你的Debian服务器CPU占用率持续90%以上,以下是排查步骤:

  1. 使用top或htop找出占用CPU最高的进程

    htop 

    按F6选择按CPU%排序,发现是一个名为”python3”的进程占用了95%的CPU。

  2. 查看该进程的详细信息

    ps -ef | grep python3 

    假设进程ID是1234,执行路径是/usr/local/bin/myapp.py

  3. 查看该进程的线程占用情况

    ps -T -p 1234 

    发现多个线程都在占用CPU。

  4. 使用strace追踪系统调用

    sudo strace -p 1234 -c 

    运行一段时间后按Ctrl+C,查看统计信息,发现大量pollselect调用,可能是在忙等待。

  5. 查看进程打开的文件和网络连接

    lsof -p 1234 ss -tunap | grep 1234 

    发现进程在不断尝试连接某个外部API,但连接失败。

  6. 分析代码或日志: 查看应用程序日志,发现是API密钥错误导致不断重试。

  7. 解决问题

    • 修复API密钥配置
    • 或者在代码中添加重试间隔和错误处理
    • 临时终止进程:sudo kill 1234

第三部分:网络问题排查

网络问题是服务器运维中最常见的问题之一。Debian提供了丰富的网络排查工具。

3.1 基础网络诊断

ping命令

测试网络连通性。

ping -c 4 google.com # -c指定次数 

traceroute命令

显示数据包到目标主机的路径。

安装:

sudo apt install traceroute 

使用:

traceroute google.com 

mtr命令

结合ping和traceroute的实时网络诊断工具。

安装:

sudo apt install mtr 

使用:

sudo mtr -r -c 10 google.com # -r报告模式,-c次数 

3.2 DNS问题排查

nslookup/dig命令

查询DNS记录。

安装dig:

sudo apt install dnsutils 

使用:

dig google.com dig @8.8.8.8 google.com # 指定DNS服务器 

检查本地DNS配置

查看/etc/resolv.conf

cat /etc/resolv.conf 

3.3 网络连接分析

netstat命令(已过时,推荐ss)

显示网络连接、路由表、接口统计等。

netstat -tunap # 显示TCP/UDP连接、数字格式、所有进程 

ss命令(推荐)

更现代的socket统计工具。

ss -tunap # 显示TCP/UDP连接、数字格式、所有进程 

lsof命令

列出打开的文件(包括网络套接字)。

lsof -i # 显示所有网络连接 lsof -i :80 # 显示占用80端口的进程 

3.4 网络流量分析

tcpdump命令

网络抓包工具。

安装:

sudo apt install tcpdump 

使用:

sudo tcpdump -i eth0 -n # -i指定网卡,-n不解析主机名 sudo tcpdump -i eth0 port 80 # 只捕获80端口流量 sudo tcpdump -i eth0 -w capture.pcap # 保存到文件 

Wireshark图形界面

安装:

sudo apt install wireshark 

使用图形界面分析pcap文件。

3.5 网络配置检查

检查IP配置

ip addr show ifconfig # 需要安装net-tools 

检查路由表

ip route show route -n # 数字格式 

检查防火墙规则

Debian默认使用iptables或nftables。

查看iptables规则:

sudo iptables -L -n -v 

查看nftables规则:

sudo nft list ruleset 

3.6 网络问题排查实战案例:无法访问外部网站

假设你的Debian服务器无法访问外部网站,以下是排查步骤:

  1. 检查本地网络连通性

    ping 127.0.0.1 # 本地回环 ping <本机IP> # 本机IP ping <网关IP> # 网关IP 

    如果网关无法ping通,检查网络配置或物理连接。

  2. 检查DNS解析

    nslookup google.com 

    如果无法解析,检查/etc/resolv.conf中的DNS服务器配置。

  3. 检查路由

    ip route show 

    确保有默认路由指向网关。

  4. 检查防火墙

    sudo iptables -L -n -v 

    确保没有阻止出站流量的规则。

  5. 检查网络接口状态

    ip link show 

    确保接口是UP状态。

  6. 使用traceroute跟踪路径

    traceroute 8.8.8.8 

    如果在第一跳就失败,说明是本地网络问题;如果在后续跳失败,可能是ISP或中间网络问题。

  7. 检查系统日志

    journalctl -u NetworkManager # 如果使用NetworkManager journalctl -u networking # 如果使用ifupdown 

第四部分:存储问题排查

存储问题包括磁盘空间不足、文件系统损坏、I/O性能下降等。

4.1 磁盘空间分析

df命令

显示文件系统磁盘空间使用情况。

df -h # 人类可读格式 df -i # 显示inode使用情况 

du命令

显示目录或文件的磁盘使用情况。

du -sh /var/* # 显示/var下各目录的大小 du -h --max-depth=1 /var # 显示/var下一级目录的大小 

查找大文件

find / -type f -size +100M -exec ls -lh {} ; # 查找大于100MB的文件 

4.2 文件系统检查

fsck命令

检查和修复文件系统。

注意:在检查文件系统前,必须先卸载该文件系统,或者在救援模式下进行。

sudo umount /dev/sda1 # 卸载分区 sudo fsck /dev/sda1 # 检查分区 

tune2fs命令

调整ext2/ext3/ext4文件系统参数。

sudo tune2fs -l /dev/sda1 # 显示文件系统信息 sudo tune2fs -c 50 /dev/sda1 # 设置强制检查间隔(挂载次数) 

4.3 磁盘I/O性能问题

使用iostat分析

iostat -x 1 5 

如果%util接近100%,说明磁盘I/O是瓶颈。

使用iotop找出I/O高的进程

sudo iotop 

使用lsof找出打开大量文件的进程

sudo lsof | awk '{print $1}' | sort | uniq -c | sort -rn | head 

4.4 存储问题排查实战案例:磁盘空间不足

假设/var分区空间不足,导致服务无法写入日志。

  1. 检查磁盘使用情况

    df -h /var 

    输出显示/var使用率100%。

  2. 查找大文件

    du -sh /var/* | sort -rh | head -n 10 

    发现/var/log占用了大部分空间。

  3. 进一步查找大日志文件

    find /var/log -type f -size +100M -exec ls -lh {} ; 

    发现/var/log/journal/journal.log有2GB。

  4. 分析日志文件

    journalctl --disk-usage # 查看journal日志占用 

    发现journal日志过多。

  5. 清理日志

    • 方法1:清理旧的日志
       journalctl --vacuum-time=7d # 保留最近7天的日志 journalctl --vacuum-size=500M # 保留最多500MB日志 
    • 方法2:手动删除(不推荐,可能破坏日志完整性)
       sudo rm /var/log/journal/*.journal 
  6. 调整日志配置: 编辑/etc/systemd/journald.conf,设置:

    SystemMaxUse=500M MaxFileSec=7day 
  7. 重启服务

    sudo systemctl restart systemd-journald 
  8. 预防措施

    • 设置日志轮转(logrotate)
    • 监控磁盘空间(使用监控工具如Nagios、Prometheus)
    • 定期清理旧日志

第五部分:系统服务管理与故障排查

Debian使用systemd管理服务,服务无法启动是常见问题。

5.1 systemd服务基础

查看服务状态

sudo systemctl status <service-name> 

启动/停止/重启服务

sudo systemctl start <service-name> sudo systemctl stop <service-name> sudo systemctl restart <service-name> 

设置开机自启

sudo systemctl enable <service-name> 

查看服务日志

sudo journalctl -u <service-name> 

5.2 服务配置文件

服务文件位置

systemd服务文件通常位于:

  • /etc/systemd/system/(用户自定义)
  • /lib/systemd/system/(系统默认)

查看服务配置

sudo systemctl cat <service-name> 

修改服务配置

  1. 编辑服务文件:sudo systemctl edit <service-name>(会创建覆盖文件)
  2. 重载配置:sudo systemctl daemon-reload
  3. 重启服务:sudo systemctl restart <service-name>

5.3 服务故障排查步骤

  1. 查看服务状态

    sudo systemctl status <service-name> 

    查看是否有错误信息。

  2. 查看详细日志

    sudo journalctl -u <service-name> -e 
  3. 检查服务依赖

    systemctl list-dependencies <service-name> 
  4. 检查服务配置

    sudo systemctl cat <service-name> 

    检查ExecStart、WorkingDirectory、User等配置是否正确。

  5. 手动执行命令: 复制服务配置中的ExecStart命令,手动执行,查看错误信息。

  6. 检查权限

    • 文件权限:ls -l <executable>
    • 用户权限:id <user>
    • SELinux/AppArmor:sudo aa-status(检查AppArmor状态)

5.4 服务故障排查实战案例:Apache无法启动

假设Apache服务无法启动,以下是排查步骤:

  1. 查看服务状态

    sudo systemctl status apache2.service 

    显示”Failed to start The Apache HTTP Server.”

  2. 查看详细日志

    sudo journalctl -u apache2.service -e 

    日志显示”AH00558: apache2: Could not reliably determine the server’s fully qualified domain name”

  3. 检查配置文件

    sudo apache2ctl configtest 

    输出”Syntax OK”,说明配置语法正确。

  4. 手动启动Apache

    sudo apache2ctl start 

    输出”Address already in use: AH00072: make_sock: could not bind to address [::]:80”

  5. 检查端口占用

    sudo ss -tlnp | grep :80 

    发现Nginx占用了80端口。

  6. 解决问题

    • 停止Nginx:sudo systemctl stop nginx
    • 或者修改Apache配置,使用其他端口。

第六部分:性能调优——让系统跑得更快

性能调优是一个系统工程,需要根据具体场景进行。以下是一些通用的调优方法。

6.1 内核参数调优

sysctl命令

动态修改内核参数。

sudo sysctl -a # 查看所有参数 sudo sysctl -w net.ipv4.ip_forward=1 # 临时修改 

永久修改:编辑/etc/sysctl.conf/etc/sysctl.d/下的文件,然后执行sudo sysctl -p

常用调优参数

网络性能

# 增加TCP连接队列大小 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 # TIME_WAIT连接重用 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0 # 在NAT环境下可能导致问题 # 增加端口范围 net.ipv4.ip_local_port_range = 1024 65535 # 增加文件描述符限制 fs.file-max = 2097152 

内存性能

# 优化内存回收策略 vm.swappiness = 10 # 减少swap使用倾向 vm.dirty_ratio = 15 # 系统内存中脏页占比达到15%时,开始同步写回磁盘 vm.dirty_background_ratio = 5 # 系统内存中脏页占比达到5%时,后台开始写回磁盘 

6.2 文件系统调优

mount选项

编辑/etc/fstab,优化挂载选项。

# 示例:优化SSD上的ext4文件系统 /dev/sda1 / ext4 defaults,noatime,nodiratime,discard 0 1 
  • noatime:不更新访问时间,减少写操作
  • nodiratime:不更新目录访问时间
  • discard:支持SSD的TRIM功能

调整I/O调度器

对于SSD,推荐使用noop或none(内核5.0+)。

# 查看当前调度器 cat /sys/block/sda/queue/scheduler # 临时修改 echo noop > /sys/block/sda/queue/scheduler # 永久修改(使用udev规则) echo 'ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"' | sudo tee /etc/udev/rules.d/60-ssd-scheduler.rules 

6.3 进程和资源限制

ulimit命令

查看和设置用户进程资源限制。

ulimit -a # 查看所有限制 ulimit -n 65535 # 临时设置文件描述符限制 

永久修改:编辑/etc/security/limits.conf

* soft nofile 65535 * hard nofile 65535 

cgroups(控制组)

cgroups可以限制、记录和隔离进程组的资源使用。

安装cgroup-tools:

sudo apt install cgroup-tools 

创建cgroup并限制CPU使用:

sudo cgcreate -g cpu:/myapp sudo cgset -r cpu.cfs_quota_us=50000 myapp # 限制使用50% CPU sudo cgexec -g cpu:myapp /usr/local/bin/myapp 

6.4 数据库性能调优(以MySQL为例)

MySQL配置文件

编辑/etc/mysql/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf

关键参数

[mysqld] # 内存相关 innodb_buffer_pool_size = 4G # 设置为系统内存的50-70% innodb_log_file_size = 512M innodb_flush_log_at_trx_commit = 2 # 平衡性能和数据安全 # 连接相关 max_connections = 500 thread_cache_size = 50 # 查询缓存(MySQL 5.7及以下) query_cache_type = 1 query_cache_size = 128M 

查看MySQL性能指标

-- 查看慢查询 SHOW VARIABLES LIKE 'slow_query_log%'; SHOW VARIABLES LIKE 'long_query_time'; -- 查看InnoDB状态 SHOW ENGINE INNODB STATUS; 

6.5 Web服务器性能调优(以Nginx为例)

Nginx配置文件优化

编辑/etc/nginx/nginx.conf或站点配置文件。

worker_processes auto; # 自动设置为CPU核心数 worker_connections 2048; # 每个worker进程的最大连接数 worker_rlimit_nofile 65535; # worker进程可打开的文件描述符限制 events { use epoll; # 高效的事件模型 worker_connections 2048; } http { sendfile on; # 启用sendfile,减少内核态和用户态之间的数据拷贝 tcp_nopush on; # 在一个包中发送响应头和文件内容 tcp_nodelay on; # 禁用Nagle算法,减少延迟 keepalive_timeout 65; # 保持连接超时时间 keepalive_requests 100; # 每个连接的最大请求数 # 缓存配置 open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; # Gzip压缩 gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; } 

调整系统参数配合Nginx

# 增加端口范围 net.ipv4.ip_local_port_range = 1024 65535 # TIME_WAIT重用 net.ipv4.tcp_tw_reuse = 1 # 增加TCP队列 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 

6.6 性能调优实战案例:优化Web服务器响应时间

假设你的Nginx服务器响应时间较长,以下是优化步骤:

  1. 分析当前性能

    sudo nginx -T # 检查配置 sudo systemctl status nginx sudo journalctl -u nginx -e 
  2. 使用ab(Apache Bench)测试

    sudo apt install apache2-utils ab -n 1000 -c 100 http://your-server/ 

    查看Requests per second(吞吐量)和Time per request(响应时间)。

  3. 检查系统资源

    htop iostat -x 1 

    发现CPU使用率不高,但磁盘I/O等待较高。

  4. 优化Nginx配置

    • 启用sendfile:sendfile on;
    • 启用gzip压缩:gzip on;
    • 调整worker_connections:worker_connections 2048;
  5. 优化内核参数

    sudo sysctl -w net.core.somaxconn=65535 sudo sysctl -w net.ipv4.tcp_tw_reuse=1 
  6. 优化文件系统: 如果使用SSD,确保挂载选项包含noatimediscard

  7. 重新测试: 再次使用ab测试,观察吞吐量和响应时间是否改善。

  8. 监控生产环境: 使用监控工具(如Prometheus+Grafana)持续监控性能指标。

第七部分:综合案例——解决复杂系统问题

案例:系统随机卡顿,响应缓慢

问题描述:Debian服务器在运行一段时间后,系统随机卡顿,SSH登录缓慢,服务响应超时。

排查步骤

  1. 初步检查

    uptime # 查看负载 free -h # 查看内存 df -h # 查看磁盘空间 

    发现负载较高(load average: 5.23, 4.15, 3.87),内存使用率90%,swap使用2GB。

  2. 详细分析

    htop # 查看进程 

    发现多个java进程占用大量内存,且swap使用频繁。

  3. 检查内存使用

    sudo vmstat 1 5 

    观察到si(换入)和so(换出)值较高,说明内存不足,频繁swap。

  4. 找出内存泄漏进程

    sudo smem -s swap # 按swap使用排序 

    发现一个Java应用占用了大量swap。

  5. 分析Java应用

    • 查看Java应用日志
    • 使用jstat查看GC情况:
       jstat -gcutil <pid> 1000 5 
    • 发现Full GC频繁,内存回收效率低。
  6. 解决问题

    • 临时方案:重启Java应用释放内存
       sudo systemctl restart my-java-app 
    • 长期方案
      • 调整JVM参数,增加堆内存:
      -Xmx2g -Xms2g # 设置最大和初始堆内存为2GB 
      • 优化应用代码,减少内存泄漏
      • 增加物理内存
  7. 预防措施

    • 设置内存监控告警
    • 定期分析应用性能
    • 使用cgroups限制进程资源

第八部分:常用排查工具速查表

工具用途常用命令
journalctl查看系统日志journalctl -u <service> -e
top/htop实时进程监控htop
ps显示进程状态ps aux
vmstat虚拟内存统计vmstat 1 5
iostat磁盘I/O统计iostat -x 1 5
iotop实时磁盘I/Osudo iotop
ss网络连接统计ss -tunap
lsof打开文件列表lsof -i :80
strace系统调用追踪strace -p <PID>
tcpdump网络抓包sudo tcpdump -i eth0
df磁盘空间df -h
du目录大小du -sh /var/*
find查找文件find / -size +100M
sysctl内核参数sysctl -a
free内存使用free -h

结论

Debian系统问题排查是一个系统工程,需要结合日志分析、性能监控、网络诊断等多种手段。掌握这些工具和方法,可以帮助你快速定位和解决问题。记住,排查问题的关键在于:

  1. 从现象出发:明确问题表现
  2. 由表及里:从系统整体到具体进程
  3. 数据说话:使用工具获取客观数据
  4. 假设验证:提出假设并验证
  5. 根因分析:找到问题的根本原因
  6. 解决预防:解决问题并制定预防措施

希望本文能帮助你成为Debian系统排查高手!在实际工作中,不断实践和总结,你会越来越熟练。