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,但服务无法启动,以下是排查步骤:
查看服务状态:
sudo systemctl status nginx.service输出可能显示”Failed to start A high performance web server and a reverse proxy server.”
查看详细日志:
sudo journalctl -u nginx.service -e-e参数表示跳转到日志末尾,方便查看最新信息。假设日志显示:
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端口已被占用。
查找占用80端口的进程:
sudo ss -tlnp | grep :80或者:
sudo lsof -i :80解决问题:
- 如果是Apache占用了端口,可以停止Apache:
sudo systemctl stop apache2 - 或者修改Nginx配置,使用其他端口。
- 如果是Apache占用了端口,可以停止Apache:
第二部分:系统性能分析——找出瓶颈所在
当系统出现响应缓慢、资源耗尽等问题时,需要使用性能分析工具来找出瓶颈。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%以上,以下是排查步骤:
使用top或htop找出占用CPU最高的进程:
htop按F6选择按CPU%排序,发现是一个名为”python3”的进程占用了95%的CPU。
查看该进程的详细信息:
ps -ef | grep python3假设进程ID是1234,执行路径是
/usr/local/bin/myapp.py。查看该进程的线程占用情况:
ps -T -p 1234发现多个线程都在占用CPU。
使用strace追踪系统调用:
sudo strace -p 1234 -c运行一段时间后按Ctrl+C,查看统计信息,发现大量
poll或select调用,可能是在忙等待。查看进程打开的文件和网络连接:
lsof -p 1234 ss -tunap | grep 1234发现进程在不断尝试连接某个外部API,但连接失败。
分析代码或日志: 查看应用程序日志,发现是API密钥错误导致不断重试。
解决问题:
- 修复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服务器无法访问外部网站,以下是排查步骤:
检查本地网络连通性:
ping 127.0.0.1 # 本地回环 ping <本机IP> # 本机IP ping <网关IP> # 网关IP如果网关无法ping通,检查网络配置或物理连接。
检查DNS解析:
nslookup google.com如果无法解析,检查
/etc/resolv.conf中的DNS服务器配置。检查路由:
ip route show确保有默认路由指向网关。
检查防火墙:
sudo iptables -L -n -v确保没有阻止出站流量的规则。
检查网络接口状态:
ip link show确保接口是UP状态。
使用traceroute跟踪路径:
traceroute 8.8.8.8如果在第一跳就失败,说明是本地网络问题;如果在后续跳失败,可能是ISP或中间网络问题。
检查系统日志:
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分区空间不足,导致服务无法写入日志。
检查磁盘使用情况:
df -h /var输出显示
/var使用率100%。查找大文件:
du -sh /var/* | sort -rh | head -n 10发现
/var/log占用了大部分空间。进一步查找大日志文件:
find /var/log -type f -size +100M -exec ls -lh {} ;发现
/var/log/journal/journal.log有2GB。分析日志文件:
journalctl --disk-usage # 查看journal日志占用发现journal日志过多。
清理日志:
- 方法1:清理旧的日志
journalctl --vacuum-time=7d # 保留最近7天的日志 journalctl --vacuum-size=500M # 保留最多500MB日志 - 方法2:手动删除(不推荐,可能破坏日志完整性)
sudo rm /var/log/journal/*.journal
- 方法1:清理旧的日志
调整日志配置: 编辑
/etc/systemd/journald.conf,设置:SystemMaxUse=500M MaxFileSec=7day重启服务:
sudo systemctl restart systemd-journald预防措施:
- 设置日志轮转(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> 修改服务配置
- 编辑服务文件:
sudo systemctl edit <service-name>(会创建覆盖文件) - 重载配置:
sudo systemctl daemon-reload - 重启服务:
sudo systemctl restart <service-name>
5.3 服务故障排查步骤
查看服务状态:
sudo systemctl status <service-name>查看是否有错误信息。
查看详细日志:
sudo journalctl -u <service-name> -e检查服务依赖:
systemctl list-dependencies <service-name>检查服务配置:
sudo systemctl cat <service-name>检查ExecStart、WorkingDirectory、User等配置是否正确。
手动执行命令: 复制服务配置中的ExecStart命令,手动执行,查看错误信息。
检查权限:
- 文件权限:
ls -l <executable> - 用户权限:
id <user> - SELinux/AppArmor:
sudo aa-status(检查AppArmor状态)
- 文件权限:
5.4 服务故障排查实战案例:Apache无法启动
假设Apache服务无法启动,以下是排查步骤:
查看服务状态:
sudo systemctl status apache2.service显示”Failed to start The Apache HTTP Server.”
查看详细日志:
sudo journalctl -u apache2.service -e日志显示”AH00558: apache2: Could not reliably determine the server’s fully qualified domain name”
检查配置文件:
sudo apache2ctl configtest输出”Syntax OK”,说明配置语法正确。
手动启动Apache:
sudo apache2ctl start输出”Address already in use: AH00072: make_sock: could not bind to address [::]:80”
检查端口占用:
sudo ss -tlnp | grep :80发现Nginx占用了80端口。
解决问题:
- 停止Nginx:
sudo systemctl stop nginx - 或者修改Apache配置,使用其他端口。
- 停止Nginx:
第六部分:性能调优——让系统跑得更快
性能调优是一个系统工程,需要根据具体场景进行。以下是一些通用的调优方法。
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服务器响应时间较长,以下是优化步骤:
分析当前性能:
sudo nginx -T # 检查配置 sudo systemctl status nginx sudo journalctl -u nginx -e使用ab(Apache Bench)测试:
sudo apt install apache2-utils ab -n 1000 -c 100 http://your-server/查看Requests per second(吞吐量)和Time per request(响应时间)。
检查系统资源:
htop iostat -x 1发现CPU使用率不高,但磁盘I/O等待较高。
优化Nginx配置:
- 启用sendfile:
sendfile on; - 启用gzip压缩:
gzip on; - 调整worker_connections:
worker_connections 2048;
- 启用sendfile:
优化内核参数:
sudo sysctl -w net.core.somaxconn=65535 sudo sysctl -w net.ipv4.tcp_tw_reuse=1优化文件系统: 如果使用SSD,确保挂载选项包含
noatime和discard。重新测试: 再次使用ab测试,观察吞吐量和响应时间是否改善。
监控生产环境: 使用监控工具(如Prometheus+Grafana)持续监控性能指标。
第七部分:综合案例——解决复杂系统问题
案例:系统随机卡顿,响应缓慢
问题描述:Debian服务器在运行一段时间后,系统随机卡顿,SSH登录缓慢,服务响应超时。
排查步骤:
初步检查:
uptime # 查看负载 free -h # 查看内存 df -h # 查看磁盘空间发现负载较高(load average: 5.23, 4.15, 3.87),内存使用率90%,swap使用2GB。
详细分析:
htop # 查看进程发现多个java进程占用大量内存,且swap使用频繁。
检查内存使用:
sudo vmstat 1 5观察到si(换入)和so(换出)值较高,说明内存不足,频繁swap。
找出内存泄漏进程:
sudo smem -s swap # 按swap使用排序发现一个Java应用占用了大量swap。
分析Java应用:
- 查看Java应用日志
- 使用jstat查看GC情况:
jstat -gcutil <pid> 1000 5 - 发现Full GC频繁,内存回收效率低。
解决问题:
- 临时方案:重启Java应用释放内存
sudo systemctl restart my-java-app - 长期方案:
- 调整JVM参数,增加堆内存:
-Xmx2g -Xms2g # 设置最大和初始堆内存为2GB- 优化应用代码,减少内存泄漏
- 增加物理内存
- 临时方案:重启Java应用释放内存
预防措施:
- 设置内存监控告警
- 定期分析应用性能
- 使用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/O | sudo 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系统问题排查是一个系统工程,需要结合日志分析、性能监控、网络诊断等多种手段。掌握这些工具和方法,可以帮助你快速定位和解决问题。记住,排查问题的关键在于:
- 从现象出发:明确问题表现
- 由表及里:从系统整体到具体进程
- 数据说话:使用工具获取客观数据
- 假设验证:提出假设并验证
- 根因分析:找到问题的根本原因
- 解决预防:解决问题并制定预防措施
希望本文能帮助你成为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,但服务无法启动,以下是排查步骤:
查看服务状态:
sudo systemctl status nginx.service输出可能显示”Failed to start A high performance web server and a reverse proxy server.”
查看详细日志:
sudo journalctl -u nginx.service -e-e参数表示跳转到日志末尾,方便查看最新信息。假设日志显示:
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端口已被占用。
查找占用80端口的进程:
sudo ss -tlnp | grep :80或者:
sudo lsof -i :80解决问题:
- 如果是Apache占用了端口,可以停止Apache:
sudo systemctl stop apache2 - 或者修改Nginx配置,使用其他端口。
- 如果是Apache占用了端口,可以停止Apache:
第二部分:系统性能分析——找出瓶颈所在
当系统出现响应缓慢、资源耗尽等问题时,需要使用性能分析工具来找出瓶颈。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%以上,以下是排查步骤:
使用top或htop找出占用CPU最高的进程:
htop按F6选择按CPU%排序,发现是一个名为”python3”的进程占用了95%的CPU。
查看该进程的详细信息:
ps -ef | grep python3假设进程ID是1234,执行路径是
/usr/local/bin/myapp.py。查看该进程的线程占用情况:
ps -T -p 1234发现多个线程都在占用CPU。
使用strace追踪系统调用:
sudo strace -p 1234 -c运行一段时间后按Ctrl+C,查看统计信息,发现大量
poll或select调用,可能是在忙等待。查看进程打开的文件和网络连接:
lsof -p 1234 ss -tunap | grep 1234发现进程在不断尝试连接某个外部API,但连接失败。
分析代码或日志: 查看应用程序日志,发现是API密钥错误导致不断重试。
解决问题:
- 修复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服务器无法访问外部网站,以下是排查步骤:
检查本地网络连通性:
ping 127.0.0.1 # 本地回环 ping <本机IP> # 本机IP ping <网关IP> # 网关IP如果网关无法ping通,检查网络配置或物理连接。
检查DNS解析:
nslookup google.com如果无法解析,检查
/etc/resolv.conf中的DNS服务器配置。检查路由:
ip route show确保有默认路由指向网关。
检查防火墙:
sudo iptables -L -n -v确保没有阻止出站流量的规则。
检查网络接口状态:
ip link show确保接口是UP状态。
使用traceroute跟踪路径:
traceroute 8.8.8.8如果在第一跳就失败,说明是本地网络问题;如果在后续跳失败,可能是ISP或中间网络问题。
检查系统日志:
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分区空间不足,导致服务无法写入日志。
检查磁盘使用情况:
df -h /var输出显示
/var使用率100%。查找大文件:
du -sh /var/* | sort -rh | head -n 10发现
/var/log占用了大部分空间。进一步查找大日志文件:
find /var/log -type f -size +100M -exec ls -lh {} ;发现
/var/log/journal/journal.log有2GB。分析日志文件:
journalctl --disk-usage # 查看journal日志占用发现journal日志过多。
清理日志:
- 方法1:清理旧的日志
journalctl --vacuum-time=7d # 保留最近7天的日志 journalctl --vacuum-size=500M # 保留最多500MB日志 - 方法2:手动删除(不推荐,可能破坏日志完整性)
sudo rm /var/log/journal/*.journal
- 方法1:清理旧的日志
调整日志配置: 编辑
/etc/systemd/journald.conf,设置:SystemMaxUse=500M MaxFileSec=7day重启服务:
sudo systemctl restart systemd-journald预防措施:
- 设置日志轮转(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> 修改服务配置
- 编辑服务文件:
sudo systemctl edit <service-name>(会创建覆盖文件) - 重载配置:
sudo systemctl daemon-reload - 重启服务:
sudo systemctl restart <service-name>
5.3 服务故障排查步骤
查看服务状态:
sudo systemctl status <service-name>查看是否有错误信息。
查看详细日志:
sudo journalctl -u <service-name> -e检查服务依赖:
systemctl list-dependencies <service-name>检查服务配置:
sudo systemctl cat <service-name>检查ExecStart、WorkingDirectory、User等配置是否正确。
手动执行命令: 复制服务配置中的ExecStart命令,手动执行,查看错误信息。
检查权限:
- 文件权限:
ls -l <executable> - 用户权限:
id <user> - SELinux/AppArmor:
sudo aa-status(检查AppArmor状态)
- 文件权限:
5.4 服务故障排查实战案例:Apache无法启动
假设Apache服务无法启动,以下是排查步骤:
查看服务状态:
sudo systemctl status apache2.service显示”Failed to start The Apache HTTP Server.”
查看详细日志:
sudo journalctl -u apache2.service -e日志显示”AH00558: apache2: Could not reliably determine the server’s fully qualified domain name”
检查配置文件:
sudo apache2ctl configtest输出”Syntax OK”,说明配置语法正确。
手动启动Apache:
sudo apache2ctl start输出”Address already in use: AH00072: make_sock: could not bind to address [::]:80”
检查端口占用:
sudo ss -tlnp | grep :80发现Nginx占用了80端口。
解决问题:
- 停止Nginx:
sudo systemctl stop nginx - 或者修改Apache配置,使用其他端口。
- 停止Nginx:
第六部分:性能调优——让系统跑得更快
性能调优是一个系统工程,需要根据具体场景进行。以下是一些通用的调优方法。
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服务器响应时间较长,以下是优化步骤:
分析当前性能:
sudo nginx -T # 检查配置 sudo systemctl status nginx sudo journalctl -u nginx -e使用ab(Apache Bench)测试:
sudo apt install apache2-utils ab -n 1000 -c 100 http://your-server/查看Requests per second(吞吐量)和Time per request(响应时间)。
检查系统资源:
htop iostat -x 1发现CPU使用率不高,但磁盘I/O等待较高。
优化Nginx配置:
- 启用sendfile:
sendfile on; - 启用gzip压缩:
gzip on; - 调整worker_connections:
worker_connections 2048;
- 启用sendfile:
优化内核参数:
sudo sysctl -w net.core.somaxconn=65535 sudo sysctl -w net.ipv4.tcp_tw_reuse=1优化文件系统: 如果使用SSD,确保挂载选项包含
noatime和discard。重新测试: 再次使用ab测试,观察吞吐量和响应时间是否改善。
监控生产环境: 使用监控工具(如Prometheus+Grafana)持续监控性能指标。
第七部分:综合案例——解决复杂系统问题
案例:系统随机卡顿,响应缓慢
问题描述:Debian服务器在运行一段时间后,系统随机卡顿,SSH登录缓慢,服务响应超时。
排查步骤:
初步检查:
uptime # 查看负载 free -h # 查看内存 df -h # 查看磁盘空间发现负载较高(load average: 5.23, 4.15, 3.87),内存使用率90%,swap使用2GB。
详细分析:
htop # 查看进程发现多个java进程占用大量内存,且swap使用频繁。
检查内存使用:
sudo vmstat 1 5观察到si(换入)和so(换出)值较高,说明内存不足,频繁swap。
找出内存泄漏进程:
sudo smem -s swap # 按swap使用排序发现一个Java应用占用了大量swap。
分析Java应用:
- 查看Java应用日志
- 使用jstat查看GC情况:
jstat -gcutil <pid> 1000 5 - 发现Full GC频繁,内存回收效率低。
解决问题:
- 临时方案:重启Java应用释放内存
sudo systemctl restart my-java-app - 长期方案:
- 调整JVM参数,增加堆内存:
-Xmx2g -Xms2g # 设置最大和初始堆内存为2GB- 优化应用代码,减少内存泄漏
- 增加物理内存
- 临时方案:重启Java应用释放内存
预防措施:
- 设置内存监控告警
- 定期分析应用性能
- 使用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/O | sudo 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系统问题排查是一个系统工程,需要结合日志分析、性能监控、网络诊断等多种手段。掌握这些工具和方法,可以帮助你快速定位和解决问题。记住,排查问题的关键在于:
- 从现象出发:明确问题表现
- 由表及里:从系统整体到具体进程
- 数据说话:使用工具获取客观数据
- 假设验证:提出假设并验证
- 根因分析:找到问题的根本原因
- 解决预防:解决问题并制定预防措施
希望本文能帮助你成为Debian系统排查高手!在实际工作中,不断实践和总结,你会越来越熟练。
支付宝扫一扫
微信扫一扫