目录
一、场景描述
(一)问题背景
(二)覆盖问题类型
二、适用范围
三、处理流程
通用前置采集流程(所有问题必做)
(一)进程调度及负载问题采集流程
(二)网络延迟丢包问题采集流程
(三)文件系统异常采集流程
(四)空间与inode异常采集流程
(五)文件系统错误与只读状态采集流程
(六)进程阻塞与D状态进程采集流程
(七)块IO性能问题采集流程
(八)内存问题采集流程
(九)存储类问题采集流程
四、注意事项
本文档提供银河麒麟高级服务器操作系统标准化日志采集流程,便于统一技术支持标准、缩短问题定位周期,且确保采集的信息完整、准确、可直接用于根因分析。
在银河麒麟高级服务器操作系统的生产运行过程中,常出现进程调度延迟、CPU负载异常、程序运行卡顿、网络丢包、文件系统故障、IO性能低下、内存泄漏、存储访问超时等问题。
本流程覆盖以下9类服务器核心故障场景:
- 进程调度延迟及CPU负载异常
- 网络通信延迟与数据包丢失
- XFS/EXT4文件系统元数据异常
- 磁盘空间耗尽与inode资源耗尽
- 文件系统错误与只读挂载状态
- 进程阻塞(D状态)与系统卡顿
- 块设备IO性能瓶颈
- 内存占用过高、泄漏与OOM问题
- NAS/IPSAN/FCSAN存储性能异常
本文档适用于技术支持工程师及具备操作系统操作权限的技术人员,覆盖银河麒麟高级服务器操作系统,适用阶段为服务器故障排查、问题复现、根因分析阶段的日志采集工作。
所有问题排查前,必须先执行以下操作,采集系统基础信息:
采集系统完整快照信息:
记录问题详情:
创建problem_description.txt文件,填写以下内容:
- 问题发生时间与持续时长
- 具体故障现象(如:SSH连接超时、数据库查询缓慢)
- 复现步骤与触发条件
- 影响范围(如:单节点/集群、业务模块)
- 已尝试的排查操作与结果
执行1次,快速定位负载类型
| # 系统整体负载与CPU占用 top -b -n 1 > top_snapshot.log uptime > uptime.log mpstat -P ALL 1 1 > mpstat_cpu.log # 内存与虚拟内存状态 free -h > free.log cat /proc/meminfo > meminfo.log cat /proc/vmstat > vmstat.log # 进程维度信息(按CPU/内存排序) ps -efH > ps_process_tree.log ps -aux --sort=-%cpu > ps_sort_cpu.log ps -aux --sort=-%mem > ps_sort_mem.log # 异常进程排查 ps -ef | grep defunct > zombie_process.log # 僵尸进程 ps -eo stat,pid,ppid,cmd | grep -E '^D' > uninterruptible_d_state.log # 不可中断进程 cat /proc/loadavg > loadavg.log |
-
-
- 基于perf工具的深度性能采集
- 安装perf工具:
-
-
-
- 全局进程调度延迟采集:
| perf sched record -aT sleep 10 # 采集全局10秒调度记录 perf sched latency -s max > perf_sched.txt |
-
-
-
- 指定进程CPU负载采集:
| perf record -ag -p <PID> # 采集10~20秒,按CTRL-C结束,在当前目录下生成perf.data cat /proc/kallsyms > kallsyms.txt # 获取内核符号表 |
-
-
- 基于bpftrace的持续调度延迟监控
安装bpftrace工具:
创建sched_latency.bt脚本:
| #!/usr/bin/bpftrace #include<linux/sched.h> BEGIN{ printf("%-6s %-6s %-6s\n","prev_pid","next_pid","latency"); } tracepoint:sched:sched_wakeup, tracepoint:sched:sched_wakeup_new { @qtime[args->pid] = nsecs; } tracepoint:sched:sched_switch { if (args->prev_state == TASK_RUNNING) { @qtime[args->prev_pid] = nsecs; } $ns = @qtime[args->next_pid]; if ($ns) { @usecs = (nsecs - $ns) /1000; // 仅统计大于1毫秒的调度延迟 if(@usecs > 1000){ time("%H:%M:%S\n"); printf("%s[%d] ---> %s[%d] latency:%d us\n",args->prev_comm,args->prev_pid,args->next_comm,args->next_pid,@usecs); } delete(@qtime[args->next_pid]); } } |
执行命令:
| bpftrace sched_latency.bt > sched.txt & |
-
-
- 程序偶发延迟的系统调用追踪
| strace -T -tt -o strace.txt -f -p <PID> |
| # 基础网络配置 ip addr > ip_addr.log ip route > ip_route.log ip neigh > arp_neigh.log ss -nultp > port_listen.log # 网卡硬件状态与统计 ethtool eth0 > ethtool.log ethtool -S eth0 > nic_statistics.log ethtool -g eth0 >> nic_statistics.log ip link show eth0 > ip_link.log # 系统网络状态汇总 ss -s > ss_summary.log netstat -s > netstat_summary.log cat /proc/net/snmp > snmp.log cat /proc/net/netstat > netstat_ext.log # 防火墙与内核网络参数 iptables -L -n > iptables.log iptables -S > iptables_rules.log sysctl -a | grep net.ipv4 > sysctl_net.log # 连接跟踪状态 sysctl -a | grep conntrack > conntrack_config.log cat /proc/net/nf_conntrack | wc -l > conntrack_count.log # 基础连通性测试 ping -c 100 -i 0.2 -W 1 目标IP > ping.log mtr --report-cycles 100 --tcp --port 端口 目标IP > mtr_tcp.log mtr --report-cycles 100 -u 目标IP > mtr_udp.log traceroute -T -p 端口 目标IP > traceroute_tcp.log # 端口连通性测试 telnet 目标IP 端口 2>&1 > telnet.log nc -zv 目标IP 端口 > nc_check.log # 抓包采集(二选一) tcpdump -i any host 目标IP and port 端口 -c 10000 -G 10 -W 1 -w tcpdump.pcap 2>/dev/null & # 二进制抓包 tcpdump -nn -i any host 目标IP and port 端口 -c 1000 > tcpdump_text.log # 文本抓包 |
-
-
- 网卡软中断单核负载高问题采集
创建nic_monitor.sh脚本:
| #!/bin/bash current_date=$(date +"%Y-%m-%d") dir_path="/var/log/monitor-$current_date" if [ ! -d "$dir_path" ]; then mkdir -p "$dir_path" fi collect_resource() { for S in `seq 17280`; do { echo "Timestamp: $(date +"%Y-%m-%d %H:%M:%S")" top -b -H -n1 pidstat -u 1 1 mpstat -P ALL 1 1 cat /sys/fs/cgroup/memory/memory.numa_stat } >> "${dir_path}/resource_log-$(date +"%Y-%m-%d").log" /usr/lib64/sa/sa1 1 1 sleep 3 done } collect_resource & wait |
执行命令:
| # 后台执行脚本 bash nic_monitor.sh & 复现问题收集/var/log/monitor-$current_date下日志 |
-
-
- ICMP报文传输延迟采集(使用skbtrace工具)
| # 基础采集(显示系统运行时间戳) ./skbtrace-(x86/arm64) -p icmp > skbtrace_icmp.log # 显示标准日期时间戳 ./skbtrace-(x86/arm64) -p icmp -t > skbtrace_icmp_time.log |
说明:skbtrace工具需向麒麟技术支持工程师单独获取
-
-
- 网络丢包问题专项采集
(1)网卡与软队列丢包监控:
创建netdrop_monitor.sh脚本:
| #!/bin/bash current_date=$(date +"%Y-%m-%d") dir_path="/var/log/netdrop-$current_date" if [ ! -d "$dir_path" ]; then mkdir -p "$dir_path" fi backup_file_info() { for S in `seq 17280`; do { echo "" echo "Timestamp: $(date +"%Y-%m-%d %H:%M:%S")" cat /proc/net/dev cat /proc/net/softnet_stat ethtool -S 网卡名|egrep -i "err|fail|drop|overrun" } >> "${dir_path}/net_log-$(date +"%Y-%m-%d").log" sleep 3 done } backup_file_info & wait |
执行命令:
| # 后台执行脚本 bash netdrop_monitor.sh & 复现问题收集/var/log/netdrop-$current_date下日志 |
(2)协议层丢包分析:
| # skbperf工具(仅X86架构) skbperf-x86 --date -d 目的IP -D 目的端口 -p tcp --ret --drop > skbtrace.log 2>&1 & # dropwatch开源工具 dropwatch -l kas # 进入交互模式后执行 start # bpftrace脚本(tcp_drop.bt) bpftrace tcp_drop.bt > tcpdrop.txt & |
| # 收集文件系统配置信息 xfs_info /mount/point > xfs_info.txt # 元数据完整转储 xfs_metadump -ao /dev/sdX(或lvs) xfs_metadata.dump # 碎片化信息采集 xfs_db -r -c freesp /dev/sdX(或lvs) > freesp.txt |
-
-
- EXT4文件系统
| # 导出超级块和块组描述符 dumpe2fs /dev/sdX > ext4_dumpe2fs.txt # 或使用debugfs获取精简统计信息 debugfs -R "stats" /dev/sdX >> ext4_superblock.log # 碎片化信息采集 e2freefrag /dev/sdX > ext4_freefrag.txt |
| # 磁盘空间与inode使用率 df -h > df_h.log df -i > df_i.log # 根目录与/var目录占用TOP排序 du -sh /* 2>/dev/null | sort -rh > du_root.log du -sh /var/* 2>/dev/null | sort -rh > du_var.log # 已删除但未释放的文件(空间满假象常见原因) lsof | grep -i deleted > lsof_deleted.log lsof | grep -E '(DEL|DELETE)' > lsof_del.log # 关键目录文件数统计(定位inode耗尽) for d in /var/tmp/data; do echo "=== $d ===" >> dir_file_count.log find $d -type f | wc -l >> dir_file_count.log done |
| # 检查是否为只读挂载 grep "ro" /proc/mounts > proc_mounts_ro.log mount | grep -i ro > mount_ro.log # 检查文件系统错误标记 tune2fs -l /dev/sdXX 2>/dev/null > tune2fs.log xfs_info /dev/sdXX 2>/dev/null > xfs_info.log xfs_admin -l /dev/sdXX 2>/dev/null > xfs_admin.log |
| # 采集D状态进程完整列表 ps -eo pid,stat,wchan,cmd | grep -E 'D|D+' > d_state.log ps auxf > ps_tree.log # 采集所有卡住进程的内核栈信息 for pid in $(ps -ef | grep -E 'D+' | awk '{print $2}'); do echo "=== PID $pid ===" >> proc_stack.log cat /proc/$pid/stack >> proc_stack.log done |
基于blktrace的一次性深度采集,创建blktrace.sh脚本:
| #!/bin/bash if [ -z $1 ];then echo -e "Usage: bash blktrace.sh /dev/sdX\n" else mkdir /tmp/blktrace cd /tmp/blktrace iostat -d -x $1 1 >> iostat.txt & >/dev/null blktrace -d $1 -o trace & >/dev/null # 默认追踪20秒,可根据需求修改 sleep 20 kill -2 `pidof blktrace` kill `pidof iostat` blkparse -i trace -d blktrace.all iowatcher -t blktrace.all -o blktrace.svg btt -i blktrace.all > blktrace.txt fi |
执行命令:
| bash blktrace.sh /dev/sdX(或lvs) |
| # 按RSS排序显示所有进程内存占用 ps -eL -o pid,comm,%mem,rss,vsz --sort rss > ps_mem_sort.log # 采集进程内存映射详细信息 pmap -xp <PID> > pid_pmap.txt # 堆内存内容dump(如需深入分析) # 第一步:获取堆地址范围 cat /proc/<PID>/smaps | grep -i heap # 第二步:执行dump gdb --batch --pid <PID> -ex "dump memory heap_dump 起始地址 结束地址" |
-
-
- Java进程JVM堆内存分析
| # GC实时占比采集(每秒1次) jstat -gcutil <PID> 1000 > jstat.txt # 堆对象分布统计 jmap -histo <PID> > jmap_histo.txt # 堆内存完整dump(可使用MAT工具分析) jmap -dump:format=b,file=heap.hprof <PID> |
-
-
- 内核态内存占用过高
创建mem_monitor.sh脚本:
| #!/bin/bash current_date=$(date +"%Y-%m-%d") dir_path="/var/log/mem-$current_date" if [ ! -d "$dir_path" ]; then mkdir -p "$dir_path" fi mem_file_info() { for S in `seq 1440`; do { echo "" echo "Timestamp: $(date +"%Y-%m-%d %H:%M:%S")" cat /proc/meminfo cat /proc/zoneinfo cat /proc/slabinfo cat /proc/buddyinfo } >> "${dir_path}/meminfo_log-$(date +"%Y-%m-%d").log" /usr/lib64/sa/sa1 1 1 sleep 60 done } mem_file_info & wait |
执行命令:
| # 后台执行脚本 bash mem_monitor.sh & 复现问题收集/var/log/mem-$current_date下日志 |
-
-
- 进程内存泄漏追踪
使用BCC工具(需安装python3-bpfcc及依赖):
| # 追踪指定进程的内存分配与释放 python3 memleak -ap <PID> -t >> memleak.txt & # 追踪percpu内存申请情况 python3 memleak --percpu >> percpu.txt & |
| # 客户端NFS挂载配置 nfsstat -m > nfsstat_client.log # 服务端NFS支持版本 cat /proc/fs/nfsd/versions > nfs_versions.log # NFS IO性能监控(每2秒采集一次) nfsiostat -a 2 -s > nfsiostat.txt # 如需单独采集lookup/readdir操作:nfsiostat -d 2 -s > nfsiostat_lookup.txt # 如需单独采集read/write操作:nfsiostat -p 2 -s > nfsiostat_rw.txt |
补充要求:同步采集对应业务场景的tcpdump抓包数据
-
-
- IPSAN/FCSAN+multipath存储性能问题
| # iSCSI会话与配置信息 iscsiadm -m node >> iscsi.txt iscsiadm -m session >> iscsi.txt cat /sys/class/iscsi_session/session*/timeout >> iscsi_timeout.log # FC控制器错误计数 cat /sys/class/fc_host/hostX/statistics/*_errors >> fc_errors.log # 多路径配置与映射关系 multipath -ll >> multipath.txt multipath -t >> multipath_config.txt |
补充要求:同步采集对应业务场景的tcpdump抓包数据
- 采集时机:所有日志必须在问题发生时或问题复现过程中采集,正常运行状态下的日志无分析价值。
- 权限要求:所有采集命令必须使用root用户执行,否则无法访问内核与进程敏感信息。
- 工具获取:skbtrace、skbperf、各类bpftrace脚本、BCC工具等需向麒麟软件技术支持工程师单独获取。
- 敏感信息处理:若日志中包含IP地址、账号密码等敏感信息,请提前脱敏并在problem_description.txt中注明。
- 偶发问题处理:对于偶发性问题,需提前部署对应持续监控脚本,待问题复现后自动采集日志。
- sosreport要求:所有问题均必须采集sosreport信息,作为基础分析数据。
所有评论(0)