java线上故障排查套路总结

线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。

文章目录

  • CPU 篇
    • 查看实时线程堆栈信息
    • 对jstack文件进行分析
    • 频繁GC
    • 上下文切换
  • 内存篇
    • 如何分析Dump文件内容
    • youngGC 过于频繁
    • youngGC 耗时过长
  • 磁盘篇
  • 网络篇
    • netstat
  • 附录
    • jstack 线程快照
    • jstat 虚拟机运行时统计
    • jmap内存快照
    • jinfo 虚拟机配置参数
    • netstat
    • 文本分析命令

CPU 篇

原因包括:业务逻辑问题(一般是死循环)、频繁gc以及上下文切换过多,可使用jstack分析线程对应的堆栈情况

查看实时线程堆栈信息

  1. top命令查找cpu使用率较高的进程
  2. 接着用 top -Hp pid 找到cpu使用率较高的线程
  3. printf '%x\n' pid 转换为nid
  4. 使用 jstack pid | grep 'nid' -A10 --color 找到对应的堆栈信息 (pid为进程pid)

(参考)


最佳实践步骤

# 先将线程占用快照信息输出到快照文件
top -H -n 1 -p 17810 > 17810.jstack
# 再将jstack信息也保存到快照文件
jstack -l 17810 >> 17810.jstack
# 然后进行分析
printf '%x\n' 18124
cat 17810.jstack | grep '46cc' -A20 --color

对jstack文件进行分析

通常我们更专注 WATING 和TIMED_WATING 的线程,BLOCKED更不用多说了

  1. 将jstack信息输出到log文件中 jstack -l pid >> pid.jstack.log
  2. cat jstack.log | grep "java.lang.Thread.State" | sort -nr | uniq -c

对jstack状态有一个整体的把握,如果WAITING之类的特别多,多半有问题

  1. cat jstack.log | grep -i -E 'BLOCKED | deadlock'

观察处于BOLCKED状态的线程数量,以及死锁信息


频繁GC

jstat -gc pid 1000 对gc分代变化情况进行观察,1000表示采样间隔(ms)

S0C/S1CS0U/S1UEC/EUOC/OUMC/MU
S0/S1 容量(kb)S0/S1 使用量(kb)Eden区容量/使用量(kb)老年代容量/使用量(kb)元数据区容量/使用量(kb)

次数代表从应用程序启动到采样时的次数

YGC/YGTFGC/FGCTGCT
YoungGC 次数/耗时(s)FullGC 次数/耗时(s)总耗时(s)

上下文切换

vmstat pid 命令 cs(context switch) 代表上下文切换次数

pidstat -w pid 命令 cswch 自愿切换/nvcswch 非自愿切换


内存篇

导出dump文件 jmap -dump:format=b,file=filename.hprof pid, 分析工具可使用 通过mat(Eclipse Memory Analysis Tools)导入dump文件进行分析 、jprofiler

如何分析Dump文件内容

分析dump文件,可以使用idea简单分析,比较方便实用,得到dump文件后
在这里插入图片描述
通过Run -> OpenProfiler Snapshot -> Open 路径打开 dump文件,例如 xxxx.hprof
打开后可以看到内存快照中哪些对象数量过多,占用内存大小等信息,
在这里插入图片描述
这里我们选中左侧byte[] 双击,看到如下内容
在这里插入图片描述
关注GC root 信息,大致就能直接定位到源码位置所在,也就大致分析出来问题故障点,当然实用JProfiler可以得到更加详细的信息,故障点位置等,这里不展开,可以评论区讨论
在这里插入图片描述

youngGC 过于频繁

短周期小对象过多,考虑Eden区/新生代是否设置过小,调整 -Xmn、-XX:SurvivorRatio ,频率仍然高,可以分析dump文件

youngGC 耗时过长

G1日志、jinfo


磁盘篇

df -hl 查看文件系统状态

磁盘性能分析通过 iostatiostat -d -k -x,最后一列%util可以看到每块磁盘写入的程度,而rrqpm/s以及wrqm/s分别表示读写速度,一般就能帮助定位到具体哪块磁盘出现问题

iotop命令来进行定位文件读写的来源,不过这边拿到的是tid,我们要转换成pid,可以通过readlink来找到pidreadlink -f /proc/*/task/tid/…/…


网络篇

netstat

netstat -tlnp查看系统中的TCP连接监听地址、端口以及进程等信息

查看端口8080被哪个进程占用:netstat -tlpn | grep :8080

查看进程1000使用了哪些tcp端口:netstat -tlpn | grep 1000

netstat -tn | grep -v ESTABLISHED查看系统中的非正常连接

附录

jstack 线程快照

jstack是Java开发工具包(JDK)中的一个命令行工具,用于生成Java虚拟机(JVM)当前时刻的线程快照(Thread Dump)。线程快照可以用于分析和调试Java应用程序中的线程问题,如死锁、线程等待等。

jstack命令的常见参数如下:

  1. -l:除了打印线程堆栈信息外,还会额外打印关于锁的附加信息,如拥有该锁的线程等待的条件。

  2. -F:当正常情况下无法获得线程快照时,强制生成线程快照。这通常在JVM处于死锁或长时间无响应状态时使用。

  3. -m:除了打印线程堆栈信息外,还会打印与线程关联的本地方法堆栈信息。

  4. -h-help:打印jstack命令的帮助信息,包括所有可用的参数和选项。

常见的jstack用法如下:

  1. 打印Java进程的线程快照:

    jstack <pid>
    

    <pid>是Java进程的进程ID。

  2. 打印Java进程的线程快照,并将结果保存到文件中:

    jstack <pid> > thread_dump.txt
    

    将线程快照输出重定向到文件thread_dump.txt中,以便后续分析和查看。

  3. 使用特定的参数生成线程快照:

    jstack -l -F <pid>
    

    这个命令将生成带有附加锁信息的强制线程快照。

  4. 生成线程快照并指定输出到标准错误流(stderr):

    jstack -l <pid> 2> error.log
    

    这个命令将线程快照输出到标准错误流,并将其重定向到文件error.log中。

  5. 使用jstack命令连接到远程Java进程并生成线程快照:

    jstack -l <hostname>:<port>
    

    <hostname>是远程主机的名称或IP地址,<port>是远程Java进程的调试端口。

jstack命令是诊断Java应用程序中线程问题的有用工具,可用于定位性能问题、死锁和线程等待等情况。通过分析线程快照,可以获得关于线程状态、锁的信息以及线程之间的相互关系,帮助开发人员进行故障排除和性能优化。

关于java.lang.Thread.State

要根据jstack命令输出的内容中的java.lang.Thread.State来判断系统的总体运行情况,可以关注线程的状态并进行分析。java.lang.Thread.State表示线程的状态,可以提供有关线程活动和阻塞的信息。以下是一些常见的线程状态和它们的含义:

  1. RUNNABLE(可运行状态):线程正在执行,或者等待CPU资源执行。

  2. BLOCKED(阻塞状态):线程正在等待获取锁,而其他线程已经持有了该锁。

  3. WAITING(等待状态):线程正在等待另一个线程发出特定信号,直到其他线程通知它继续执行。

  4. TIMED_WAITING(计时等待状态):线程正在等待一段时间,直到超时或者其他线程通知它继续执行。

  5. TERMINATED(终止状态):线程已经执行完毕或者因为异常等原因被终止。

通过观察jstack命令输出中各个线程的状态,可以对系统的总体运行情况进行初步判断。下面是一些常见的判断场景:

  1. 如果大多数线程处于RUNNABLE状态,系统可能正常运行,并且没有明显的性能瓶颈。

  2. 如果有大量线程处于BLOCKED状态,系统可能存在严重的竞争条件或死锁情况。需要进一步分析具体的线程堆栈信息来解决问题。

  3. 如果有线程处于WAITINGTIMED_WAITING状态,可以根据线程等待的对象或条件来判断是否有资源争用或线程间通信的问题。

  4. 如果有线程处于TERMINATED状态,表示线程已经执行完毕,但可以进一步观察是否有异常抛出或其他异常情况发生。

需要注意的是,仅通过线程状态无法完全确定系统的总体运行情况,因为线程状态只是系统的一个方面。综合考虑线程状态、线程数量、CPU使用率、内存使用情况等信息可以更全面地评估系统的运行状况。在分析线程堆栈信息时,还应注意查看是否存在异常、死锁、阻塞等特定的线程问题,并进行相应的故障排除和性能优化。

jstat 虚拟机运行时统计

jstat是Java开发工具包(JDK)中的一个命令行工具,用于监视和收集Java虚拟机(JVM)的各种运行时统计信息。它可以提供有关堆内存、垃圾回收、类加载、线程和编译器等方面的数据,用于性能分析和故障排除。

jstat命令的常见参数如下:

  1. -class:打印类加载、卸载和总计的统计信息。

  2. -compiler:打印JIT编译器的统计信息,包括编译任务数量、编译耗时等。

  3. -gc:打印垃圾回收统计信息,包括堆内存使用情况、垃圾回收次数、回收时间等。

  4. -gccapacity:打印堆内存容量和使用情况的详细信息,包括新生代、老年代、持久代的容量、使用量和空闲量等。

  5. -gcutil:打印垃圾回收统计信息的摘要,包括垃圾回收器的使用率、堆内存的使用率等。

  6. -printcompilation:打印JIT编译器编译方法的详细信息,包括方法名称、编译状态、编译耗时等。

  7. -utilization:打印垃圾回收器的利用率,包括新生代、老年代、元数据区的利用率。

  8. -options:打印JVM的命令行选项和系统属性。

常见的jstat用法如下:

  1. 监视Java进程的类加载情况:

    jstat -class <pid> [interval] [count]
    

    <pid>是Java进程的进程ID,[interval]是采样间隔时间(以毫秒为单位,默认值为1000ms),[count]是采样次数(默认值为无限次)。

  2. 监视Java进程的垃圾回收统计信息:

    jstat -gc <pid> [interval] [count]
    

    <pid>是Java进程的进程ID,[interval]是采样间隔时间(以毫秒为单位,默认值为1000ms),[count]是采样次数(默认值为无限次)。

  3. 监视Java进程的堆内存容量和使用情况:

    jstat -gccapacity <pid> [interval] [count]
    

    <pid>是Java进程的进程ID,[interval]是采样间隔时间(以毫秒为单位,默认值为1000ms),[count]是采样次数(默认值为无限次)。

  4. 监视Java进程的JIT编译器统计信息:

    jstat -compiler <pid> [interval
    

jmap内存快照

jmap是Java开发工具包(JDK)中的一个命令行工具,用于生成Java进程的内存映像和堆转储快照。它可以用于分析Java应用程序的内存使用情况、查找内存泄漏和性能问题等。

jmap命令的常见参数如下:

  1. -heap:打印Java进程的堆内存使用情况,包括堆的大小、使用量、垃圾回收器的详细信息等。

  2. -histo:打印Java进程的堆内存中对象的统计信息,包括对象类型、数量和占用内存大小等。

  3. -dump:<dump-options>:生成Java进程的堆转储快照(Heap Dump),可以用于分析内存泄漏和对象分布等。<dump-options>可以是以下选项之一:

    • live:只转储活动对象(默认选项)。
    • all:转储所有对象,包括活动对象和垃圾对象。
    • file=<filename.hprof>:将堆转储快照保存到指定的文件中。
    • format=<format>:指定堆转储快照的格式,可以是b(二进制格式)或h(文本格式,默认值)。
  4. -finalizerinfo:打印等待终结的对象的信息,包括等待终结队列的长度和具体对象的信息。

  5. -permstat:打印永久代(PermGen/Metaspace)的统计信息,包括类加载器、类和字符串的数量和占用内存大小等。

常见的jmap用法示例如下:

  1. 打印Java进程的堆内存使用情况:

    jmap -heap <pid>
    

    <pid>是Java进程的进程ID。

  2. 打印Java进程的堆内存中对象的统计信息:

    jmap -histo <pid>
    

    <pid>是Java进程的进程ID。

  3. 生成Java进程的堆转储快照,并保存到文件中:

    jmap -dump:file=<filename> <pid>
    

    <filename>是要保存堆转储快照的文件名,<pid>是Java进程的进程ID。

  4. 打印等待终结的对象的信息:

    jmap -finalizerinfo <pid>
    

    <pid>是Java进程的进程ID。

  5. 打印永久代(PermGen/Metaspace)的统计信息:

    jmap -permstat <pid>
    

    <pid>是Java进程的进程ID。

jmap命令是一个强大的工具,可以帮助开发人员分析Java应用程序的内存使用情况和性能问题。通过使用不同的参数组合,可以获取有关堆内存、对象统计、堆转储等方面的详细信息。请注意,在使用jmap命令时,建议谨慎使用并避免在生产环境中使用,以避免对应用程序性能产生负面影响。

jinfo 虚拟机配置参数

jinfo是Java开发工具包(JDK)中的一个命令行工具,用于查看和调整Java进程的Java虚拟机(JVM)配置参数和系统属性。它可以帮助开发人员获取Java进程的运行时信息,并对其进行动态调整。

jinfo命令的常见参数如下:

  1. -flag <name>:打印指定JVM参数的当前值和默认值。

  2. -flags:打印Java进程的所有JVM参数和系统属性。

  3. -sysprops:打印Java进程的所有系统属性。

  4. -h-help:打印jinfo命令的帮助信息,包括所有可用的参数和选项。

常见的jinfo用法示例如下:

  1. 打印Java进程的指定JVM参数的当前值和默认值:

    jinfo -flag <name> <pid>
    

    <name>是要打印的JVM参数的名称,<pid>是Java进程的进程ID。

  2. 打印Java进程的所有JVM参数和系统属性:

    jinfo -flags <pid>
    

    <pid>是Java进程的进程ID。

  3. 打印Java进程的所有系统属性:

    jinfo -sysprops <pid>
    

    <pid>是Java进程的进程ID。

jinfo命令可以帮助开发人员获取Java进程的运行时信息,如JVM参数和系统属性的值。通过查看这些信息,可以了解Java进程的配置和环境,帮助进行故障排除和性能优化。此外,jinfo还可以用于动态调整JVM参数的值,但在使用时需要谨慎,避免对应用程序产生不可预知的影响。

netstat

netstat命令的一些常见用法示例,以帮助排查端口被哪个进程占用等相关信息:

  1. 显示所有活动连接和监听端口:

    netstat -a
    
  2. 仅显示TCP连接:

    netstat -at
    
  3. 仅显示UDP连接:

    netstat -au
    
  4. 显示与网络连接关联的进程/程序:

    netstat -ap
    
  5. 显示正在监听的TCP端口:

    netstat -ltn
    
  6. 显示正在监听的UDP端口:

    netstat -lun
    
  7. 显示与指定端口相关的进程/程序:

    netstat -tulpn | grep <端口号>
    

    例如,要查找占用端口80的进程,可以使用:

    netstat -tulpn | grep :80
    
  8. 显示网络统计信息和摘要:

    netstat -s
    
  9. 显示路由表信息:

    netstat -r
    

这些示例将帮助快速了解网络连接状态、监听端口和相关进程的信息。请注意,有些示例可能需要root或管理员权限才能显示完整的信息。

netstat命令还有其他参数和选项可用于更精细的控制和筛选输出。可以通过man netstat命令在终端上查看完整的netstat命令手册以获取更多详细信息

文本分析命令

cat info.log | awk -F '(回调类型EventType=|,callbackMsg)' '{print $2}' | sort | uniq -c | sort -nr

从名为 info.log 的文件中读取内容,使用 awk 命令将每行按照指定的字段分隔符提取出第二个字段,然后对提取的字段进行排序,统计每个字段出现的次数,并按照次数进行逆序排列。

cat 将文本文件内容输出到标准输出

awk是一种文本处理工具,它可以按行扫描和处理文件。

-F '(回调类型EventType=|,callbackMsg)'用于指定字段分隔符,这里是使用正则表达式作为分隔符,表示字段可以通过字符串 “回调类型EventType=” 或 “,callbackMsg” 来分隔。

'{print $2}'是一个 AWK 脚本,表示打印每行中的第二个字段。

uniq -c 用于去除重复的行,保留唯一的行 -c 用于计数并显示美航出现的次数

sort -nr 按照数值降序,从大到小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/3067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Principle Component Analysis

简述PCA的计算过程 输入&#xff1a;数据集X{x1&#xff0c;x2&#xff0c;...&#xff0c;xn}&#xff0c;需降到k维 ① 去中心化&#xff08;去均值&#xff0c;即每个特征减去各自的均值&#xff09; ② 计算协方差矩阵1/nX*X^T&#xff08;1/n不影响特征向量&#xff09…

day39-Oracle分区表

0目录 Oracle分区表 1.2.3 1. Oracle分区表 1.1 作用&#xff1a; Oracle数据库的分区把表中的数据行按照分区划成几个区域&#xff0c;提高大数据量下表的性能 1.2 应用场景&#xff1a;常应用于数据量大的表 1.3 分类&#xff1a;Oracle中有范围分区&#xff08;最常见…

vue使用docxtemplater导出word实现使用textarea输入的内容换行

注:本文只做导出word并且换行操作&#xff0c;不做vue引入docxtemplater步骤 先看一下实现效果 这是文本域输入的 这是导出来的结果 可以看出来导出来的结果也是换行的呢 接下来我们手摸手操作一下流程 首先咱们捋一捋思路 知道文本域的换行的换行标识符&#xff0c;我们发…

[深度学习入门]什么是神经网络?[神经网络的架构、工作、激活函数]

目录 一、前言二、神经网络的架构——以手写数字识别三、神经网络的工作1、单输入单输出感知器函数2、二维输入参数3、三维输入参数 四、激活函数1、激活函数2、ReLU激活函数3、非线性激活函数&#xff08;1&#xff09;二输入二输出的神经网络的架构&#xff08;2&#xff09;…

基于预测控制模型的自适应巡航控制仿真与机器人实现(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 自适应巡航控制技术为目前由于汽车保有量不断增长而带来的行车安全、驾驶舒适性及交通拥堵等问题提供了一条有效的解决途径&am…

数据结构(王道)——数据结构之 二叉树的存储结构

一、顺序存储 静态顺序存储 顺序存储的二叉树结构特性&#xff1a; 顺序存储的非完全二叉树特性 不完全二叉树的可能会浪费大量空间&#xff0c;所以一般顺序存储二叉树比较少用。 图示为什么很少用顺序存储来存二叉树 顺序存储的二叉树总结&#xff1a; 二、链式存储 二叉链表…

TCP的三次握手过程

TCP 是面向连接的协议&#xff0c;所以使用 TCP 前必须先建立连接&#xff0c;而建立连接是通过三次握手来进行的。三次握手的过程如下图&#xff1a; 刚开始客户端处于 closed 的状态&#xff0c;服务端处于 listen 状态。 第一次握手&#xff1a;客户端给服务端发一个 SYN 报…

stb_image简单使用

简介stb_image stb_image 是一个非常轻量级的、单文件的图像加载库&#xff0c;用于加载和解码多种图像格式&#xff08;如BMP、JPEG、PNG、GIF等&#xff09;的图像数据。它由Sean T. Barrett开发&#xff0c;并以公共领域&#xff08;Public Domain&#xff09;许可发布&…

Redis实战案例21-消息队列

1. 基于JVM的阻塞队列的局限 JVM内存限制问题&#xff0c;大量订单出现时&#xff0c;可能会超过JVM阻塞队列上限&#xff1b;阻塞队列并不能持久化&#xff0c;因为内存不能持久化&#xff0c;出现异常或者宕机之类的故障时&#xff0c;出现数据丢失&#xff1b; 所以引出消息…

关于GPT、AI绘画、AI提词器等AI技术的探讨

目前的AI潮流非常火热&#xff0c;CHATGPT可谓是目前大模型人工智能的代表&#xff0c;刚开始听说chatGPT可以写代码&#xff0c;写作&#xff0c;写方案&#xff0c;无所不能。还有AI绘画也很&#xff2e;&#xff22;作为一个程序员&#xff0c;为了体验这些&#xff21;&…

基于深度学习的高精度线路板瑕疵目标检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度线路板瑕疵目标检测系统可用于日常生活中来检测与定位线路板瑕疵目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的线路板瑕疵目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

物理机传输大文件到虚拟机

物理机快速传输大文件到虚拟机 测试使用Tabby传输大文件到虚拟机 1.1 准备大文件 1.2 通过Tabby上传文件到Linux 总耗时约&#xff1a;7分钟 1.3 通过EveryThing配置服务 打开EveryThing&#xff0c;点击工具—> 选项—>http服务器 启用HTTP服务器&#xff0c;配置…

Hyper-V安装Ubuntu-18.04

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、准备工作&#xff1f;二、下载指定的Ubuntu ISO镜像三、开始配置1.点击快速创建2.选择安装源 四、开始安装五、配置启动项总结 前言 最近有个很扯淡的问题…

如何快速入门C#编程?

学习C#需要持续努力和实践&#xff0c;但是在一周内入门是有可能的&#xff0c;前提是你愿意付出足够的时间和精力。以下是一周内入门C#的步骤和建议&#xff1a; 设定学习目标&#xff1a; 在一周内学习C#需要专注于基础知识。明确你的学习目标&#xff0c;例如了解语法、变量…

基于Java+SpringBoot+Vue+Uniapp前后端分离考试学习一体机设计与实现(视频讲解,已发布上线)

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

《面试1v1》Kafka基础

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

React和Vue生命周期、渲染顺序

主要就是命名不同 目录 React 组件挂载 挂载前constructor() 挂载时render() 挂载后componentDidMount()&#xff1a;初始化节点 更新 更新时render()&#xff1a;prop/state改变 更新后componentDidUpdate() 卸载 卸载前componentWillUnmount()&#xff1a;清理 V…

基于Redisson的Redis结合布隆过滤器使用

一、场景 缓存穿透问题 一般情况下&#xff0c;先查询Redis缓存&#xff0c;如果Redis中没有&#xff0c;再查询MySQL。当某一时刻访问redis的大量key都在redis中不存在时&#xff0c;所有查询都要访问数据库&#xff0c;造成数据库压力顿时上升&#xff0c;这就是缓存穿透。…

【已解决】ModuleNotFoundError: No module named ‘timm.models.layers.helpers‘

文章目录 错误信息原因解决方法专栏&#xff1a;神经网络精讲与实战AlexNetVGGNetGoogLeNetInception V2——V4ResNetDenseNet 错误信息 在使用timm库的时候出现了ModuleNotFoundError: No module named timm.models.layers.helpers’的错误&#xff0c;详情如下&#xff1a; …

CANoe如何配置Master/Slave模式

系列文章目录 文章目录 系列文章目录前言一、CANoe配置端口二、CANoe配置Master模式三、CANoe配置Slave模式前言 随着智能电动汽车的行业的发展,车载以太网的应用越来越广泛,最近很多朋友在问CANoe Master/Slave模式如何设置,车载以太网物理层也有一项是测试Master/Slave模式…