银河麒麟高级服务器操作系统日志采集标准处理流程

目录

一、场景描述

(一)问题背景

(二)覆盖问题类型

二、适用范围

三、处理流程

通用前置采集流程(所有问题必做)

(一)进程调度及负载问题采集流程

(二)网络延迟丢包问题采集流程

(三)文件系统异常采集流程

(四)空间与inode异常采集流程

(五)文件系统错误与只读状态采集流程

(六)进程阻塞与D状态进程采集流程

(七)块IO性能问题采集流程

(八)内存问题采集流程

(九)存储类问题采集流程

四、注意事项

  • 场景描述

本文档提供银河麒麟高级服务器操作系统标准化日志采集流程,便于统一技术支持标准、缩短问题定位周期,且确保采集的信息完整、准确、可直接用于根因分析。

在银河麒麟高级服务器操作系统的生产运行过程中,常出现进程调度延迟、CPU负载异常、程序运行卡顿、网络丢包、文件系统故障、IO性能低下、内存泄漏、存储访问超时等问题。

本流程覆盖以下9类服务器核心故障场景:

  1. 进程调度延迟及CPU负载异常
  2. 网络通信延迟与数据包丢失
  3. XFS/EXT4文件系统元数据异常
  4. 磁盘空间耗尽与inode资源耗尽
  5. 文件系统错误与只读挂载状态
  6. 进程阻塞(D状态)与系统卡顿
  7. 块设备IO性能瓶颈
  8. 内存占用过高、泄漏与OOM问题
  9. NAS/IPSAN/FCSAN存储性能异常

本文档适用于技术支持工程师及具备操作系统操作权限的技术人员,覆盖银河麒麟高级服务器操作系统,适用阶段为服务器故障排查、问题复现、根因分析阶段的日志采集工作。

所有问题排查前,必须先执行以下操作,采集系统基础信息:

采集系统完整快照信息:

sosreport --all-logs

记录问题详情:
创建problem_description.txt文件,填写以下内容:

  1. 问题发生时间与持续时长
  2. 具体故障现象(如:SSH连接超时、数据库查询缓慢)
  3. 复现步骤与触发条件
  4. 影响范围(如:单节点/集群、业务模块)
  5. 已尝试的排查操作与结果

执行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

      1. 基于perf工具的深度性能采集
        1. 安装perf工具:

yum -y install perf

        1. 全局进程调度延迟采集:

perf sched record -aT sleep 10  # 采集全局10秒调度记录
perf sched latency -s max > perf_sched.txt

        1. 指定进程CPU负载采集:

perf record -ag -p <PID>  # 采集10~20秒,按CTRL-C结束,在当前目录下生成perf.data
cat /proc/kallsyms > kallsyms.txt  # 获取内核符号表

      1. 基于bpftrace的持续调度延迟监控
安装bpftrace工具:

yum -y install 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 &

      1. 程序偶发延迟的系统调用追踪

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  # 文本抓包

      1. 网卡软中断单核负载高问题采集

创建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下日志

      1. ICMP报文传输延迟采集(使用skbtrace工具)

# 基础采集(显示系统运行时间戳)
./skbtrace-(x86/arm64) -p icmp > skbtrace_icmp.log
# 显示标准日期时间戳
./skbtrace-(x86/arm64) -p icmp -t > skbtrace_icmp_time.log

说明:skbtrace工具需向麒麟技术支持工程师单独获取

      1. 网络丢包问题专项采集

(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

      1. 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 起始地址 结束地址"

      1. 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>

      1. 内核态内存占用过高

创建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下日志

      1. 进程内存泄漏追踪

使用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抓包数据

      1. 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抓包数据

  1. 采集时机:所有日志必须在问题发生时或问题复现过程中采集,正常运行状态下的日志无分析价值。
  2. 权限要求:所有采集命令必须使用root用户执行,否则无法访问内核与进程敏感信息。
  3. 工具获取:skbtrace、skbperf、各类bpftrace脚本、BCC工具等需向麒麟软件技术支持工程师单独获取。
  4. 敏感信息处理:若日志中包含IP地址、账号密码等敏感信息,请提前脱敏并在problem_description.txt中注明。
  5. 偶发问题处理:对于偶发性问题,需提前部署对应持续监控脚本,待问题复现后自动采集日志。
  6. sosreport要求:所有问题均必须采集sosreport信息,作为基础分析数据。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐