故障诊断 | 系统级追踪诊断方法及案例分享

我们在进行Oracle故障调试和内核原理工作的时候,经常需要了解后台运行的动作和细节。一些故障场景,如ORACLE后台进展慢、程序无法启动、无法登陆、相同环境执行结果却大不相同等问题,就需要操作系统级别监控,检查定位问题。

Oracle自身已经提供了很多这类型的工具,如oradebug、各种等待事件和跟踪方式。此外,各类型的操作系统提供出很多系统级别工具,帮助我们进行监控。

我们先来看一个简单的示例:

LGWR进程写 online redo log是否用到缓存?

这里的这个缓存不是指数据库缓存,操作系统的文件缓存,如果对这个问题不明白,我们先看另外一个问题,我们如果怀疑存储有问题,经常会使用DD命令对磁盘进行测试,相关命令如下所示,那这个命令对磁盘的操作是直接写磁盘还是把数据写到文件缓存里去?

我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。

07e570461bd44f1933db31e88422454490e0c0fd

我们来实地进行测试验证看一下,这是在我电脑虚拟机上的一个测试结果,DD了2G的文件,花了4.99秒的时间,实际上这个命令结束的时候数据没真正写到磁盘上去,对于磁盘的写到缓存就返回了。我们另外看一条命令

849f73df587850f4d935bcb6ae00b19aeebebdff

这里加了一个标志,就是ofag=sync,加完这个标示之后,我们发现写磁盘的速度下降了,写2G的文件花了8秒,多用了60%的时间。这就是文件系统缓存的作用,文件系统缓存大大增加了主机的性能。

我们现在回到之前那个问题,LGWR进程写redo log 会不会用到缓存呢?我们使用strace –p命令来跟踪LGWR进程,为方便观察我们添加一组新的redo日志组并进行切换。

c362b9ce209373368a908b021e5682548aa6df6a

通过分析TRACE信息我们发现,LGWR进程对online redo log打开使用了o_sync标示,该标示表示直接写入存储设备。

TRUSS/TUSC/STRACE是什么?

下面我引用一下TRUSS的官方解释,TUSC与STRACE工具功能基本一样。

原文链接

<think>我们正在处理关于诊断CODESYS Runtime在实时系统中的常见故障的问题。根据用户之前的上下文,用户可能是在使用Xenomai实时内核的系统中运行CODESYS Runtime。因此,诊断故障需要从实时性保障的角度出发。 参考引用: [1]: 树莓派4B安装CODESYS Runtime的方法,其中包含安装包和配置步骤。 [2]: 工业虚拟机模板中预装工业运行时环境(包括CODESYS)并配置实时内核参数,如调整调度器参数。 根据以上信息,我们可以将诊断分为以下几个步骤: 1. **实时性检查**:确保实时内核(如Xenomai)的延迟在可接受范围内。 2. **CODESYS Runtime服务状态检查**:检查CODESYS Runtime服务是否正常运行。 3. **资源分配检查**:包括CPU隔离、内存锁定等实时性保障措施是否到位。 4. **日志分析**:检查系统日志和CODESYS Runtime日志。 5. **网络与通信检查**:因为CODESYS通常用于工业控制,网络通信的实时性也很重要。 具体步骤: ### 1. 实时性检查 使用Xenomai提供的工具测试系统实时性能: ```bash /usr/xenomai/bin/latency -t0 -p 100 -h -g result.csv ``` 观察最大延迟是否在CODESYS Runtime要求的范围内(通常<100μs,具体参考CODESYS文档)。如果延迟过大,需要按照之前优化Xenomai的方法进行调整。 ### 2. CODESYS Runtime服务状态检查 检查服务是否运行: ```bash systemctl status codesys-control ``` 如果服务未运行,尝试启动并查看错误信息: ```bash systemctl start codesys-control journalctl -u codesys-control -b --no-pager ``` ### 3. 资源分配检查 - **CPU隔离**:确保CODESYS Runtime运行在隔离的核心上。检查启动参数(如`isolcpus`)是否设置正确。 - **内存锁定**:检查`/etc/security/limits.conf`中是否对CODESYS Runtime用户(如`codesys`)设置了`memlock`无限制。 - **调度参数**:检查引用[2]中提到的实时调度参数: ```bash # 查看当前值 sysctl kernel.sched_rt_runtime_us sysctl kernel.sched_rt_period_us ``` 确保: ``` kernel.sched_rt_runtime_us = 950000 kernel.sched_rt_period_us = 1000000 ``` ### 4. 日志分析 - **系统日志**:`dmesg`和`/var/log/syslog`中查看与Xenomai、CODESYS相关的错误。 - **CODESYS日志**:在CODESYS开发环境中查看PLC日志,或者检查运行时的日志文件(通常在`/var/log/codesys`目录下)。 ### 5. 网络与通信检查 如果使用EtherCAT等实时以太网协议,检查主站配置和网络状态: ```bash # 检查网卡状态 ethtool eth0 # 检查EtherCAT主站状态(如果使用) ethercat master ``` ### 常见故障及解决方案 | 故障现象 | 可能原因 | 解决方案 | |----------------------------|---------------------------|---------------------------------------------| | 周期性延迟抖动 | 非实时中断干扰 | 绑定中断到非实时核,屏蔽非实时核的定时器 | | CODESYS Runtime启动失败 | 依赖库缺失或权限问题 | 检查安装包完整性,确保用户组(如`xenomai`)权限 | | PLC程序运行中断 | 内存不足或换页延迟 | 增加内存锁定设置,检查内存使用情况 | | 通信丢包 | 网络配置问题 | 优化网络参数,如增加socket缓冲区大小 | ### 高级诊断工具 - **使用`trace-cmd`跟踪内核事件**: ```bash trace-cmd record -e xenomai:* -e sched_switch trace-cmd report ``` - **使用`cyclictest`测试实时性**(如果同时安装了Xenomai和PREEMPT_RT): ```bash cyclictest -t1 -p 80 -i 100 -n ``` ### 示例:诊断启动失败问题 1. 查看服务状态: ```bash systemctl status codesys-control ``` 2. 如果提示“Failed to start CODESYS Control”,则查看详细日志: ```bash journalctl -u codesys-control -b --no-pager ``` 3. 常见错误:缺少库文件。解决方法:安装缺失的库,例如: ```bash sudo apt-get install libatomic1 ``` 通过以上步骤,可以系统地诊断CODESYS Runtime在实时系统中的常见故障。 §§相关问题§§ 1. 如何配置CODESYS Runtime以利用Xenomai实时内核? 2. 在CODESYS Runtime中如何监控实时任务的执行时间? 3. 如何为CODESYS Runtime分配专用的CPU核心? 4. 如何解决CODESYS Runtime与实时以太网(如EtherCAT)的通信中断问题?</think>### 诊断CODESYS Runtime在实时系统中的常见故障指南 #### 1. **实时性验证与延迟分析** ```bash # 运行Xenomai延迟测试(需在隔离核心执行) taskset -c 2,3 /usr/xenomai/bin/latency -t0 -p 100 -g codesys_latency.csv # 检查内核实时性指标 cat /proc/xenomai/stat | grep -E "max|avg" ``` - **故障现象**:最大延迟超过100μs - **诊断步骤**: 1. 分析`codesys_latency.csv`中的延迟峰值分布 2. 检查`/proc/interrupts`确认中断风暴 3. 执行`dmesg | grep -i "xenomai|codesys"`查看内核警告 4. 验证CPU隔离状态:`cat /sys/devices/system/cpu/isolated` #### 2. **运行时资源冲突检测** ```bash # 监控CODESYS进程资源使用 pid=$(pgrep codesys-runtime) perf trace -p $pid -e sched:sched_switch,irq:irq_handler_entry ``` - **常见故障**: - **内存锁失败**:`dmesg`中出现`"mlock failed for CODESYS"` - **CPU抢占冲突**:`/proc/sched_debug`显示高优先级任务阻塞 - **中断风暴**:`/proc/interrupts`中特定IRQ计数异常增长 #### 3. **实时内核配置验证** 检查关键参数(引用[2]的配置): ```bash # 验证调度参数 sysctl kernel.sched_rt_runtime_us # 应为950000 sysctl kernel.sched_rt_period_us # 应为1000000 # 检查内存锁定配置 grep "memlock" /etc/security/limits.conf # 应包含"@codesys - memlock unlimited" ``` #### 4. **通信栈故障诊断** ```bash # 检测EtherCAT/Profinet通信状态 ethercat --master 0 slaves tcptdump -i eth0 -nn "port 4840" # OPC UA通信抓包 ``` - **典型故障模式**: ```mermaid graph LR A[通信中断] --> B{原因诊断} B --> C[网卡DMA未隔离] B --> D[交换机端口阻塞] B --> E[实时周期不匹配] ``` #### 5. **日志深度分析** ```bash # CODESYS特定日志(需启用调试模式) tail -f /var/log/codesys/PlcLogic.log # 实时内核事件追踪 echo 1 > /proc/xenomai/debug/trace cat /proc/xenomai/trace > codesys_trace.log ``` - **关键日志模式**: - `"TASK DELAYED by [N] μs"` → 调度延迟 - `"MEMFAULT at 0x..."` → 内存访问冲突 - `"CYCLE TIME OVERRUN"` → 周期任务超时 #### 6. **故障树分析(FTA)** | 故障现象 | 可能原因 | 验证命令 | |--------------------------|-----------------------------------|------------------------------| | PLC任务周期超时 | 非实时进程抢占CPU | `ps -eo pid,cls,rtprio,cmd` | | 通信数据包丢失 | 网卡中断未绑定 | `cat /proc/irq/*/smp_affinity` | | 运行时意外终止 | 内存锁失败 | `grep -i "oom" /var/log/kern.log` | | 实时任务抖动增大 | CPU频率缩放启用 | `cpupower frequency-info` | #### 7. **硬件相关故障排除** ```bash # 检查PCIe设备实时性 lspci -vvv | grep -E "LnkSta|MSI-X" # 禁用CPU节能特性 cpupower idle-set -D # 禁用C-states cpupower frequency-set -g performance ``` - **关键措施**: - BIOS中禁用`C-States`和`Package C-State` - 启用`PCIe ASPM L1.2`电源模式 - NUMA架构绑定内存节点:`numactl --cpunodebind=0 --membind=0 codesys-runtime` ### 典型故障解决案例 **问题**:CODESYS运行时每2小时出现10ms延迟峰值 **诊断过程**: 1. `latency`测试显示周期性延迟 2. `perf top`发现`irq/46-eth0`中断占用高 3. 检查发现网卡IRQ未绑定:`echo 4 > /proc/irq/46/smp_affinity` 4. 配置CPU隔离:`isolcpus=2,3`(引用[2]方法) 5. 最终延迟峰值从10ms降至35μs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值