Oracle RAC最佳实践-优化私网连接
在 Oracle RAC 环境中,私网(Interconnect) 是节点之间通信和数据传输的关键部分。一直有个误解,认为私网(心跳网)只要能通随便什么交换机都可以,甚至有直连的,实际上私网的性能至关重要,应该用公司里性能最好的交换机;私网连接性能直接影响集群的整体效率,尤其是在全局缓存(GC,Global Cache)操作中,如果通信延迟或带宽不足,会导致等待事件增多,进而影响数据库性能。在ORACLE RAC最佳实践中 私网络建议配置 Jumbo Frame(也就是设置网卡的 MTU 为 9000,默认为1500),可以极大的减少心跳网络上的包重组。Jumbo Frame 可以非常有效地解决很多 RAC 上的 ORA-600/ORA-7445/性能问题/节点驱逐问题。比如: 常见的“节点不断因心跳中断被驱逐的问题” 和某些 “ORA-600 [kjctr_pbmsg:badbmsg2] 的问题”。
为什么要配置Jumbo Frame:
以太网是集群互联(Cluster Interconnect)中广泛使用的网络技术。以太网的可变帧大小范围为46-1500 字节,这是主机、交换机等所有以太网参与者之间的传输单元。在这种情况下,1500 字节的上限被称为MTU(Maximum Transmission Unit,最大传输单元)。当一个应用程序发送的消息大于1500 字节(MTU) 时,这些消息会被分段为1500 字节或更小的帧,在端点之间进行传输。在 Oracle RAC 中,DB_BLOCK_SIZE(一般8K) 乘以db_file_multiblock_read_count(默认128)的设置决定了全局缓存(Global Cache)消息的最大大小,而PARALLEL_EXECUTION_MESSAGE_SIZE(默认16384) 决定了并行查询(Parallel Query)中消息的最大大小。这些消息的大小可以从2K 到64K 或更大。因此,在使用较低或默认的 MTU 值时,消息会被分段得更加频繁,碎片化更严重,消息重组消耗更多的时间,从而带来RAC性能问题。
1. 在负载较高时,或者实例重启时,私网流量会很大。
2. 增大MTU减少包重组可以显著提升RAC的稳定性。
3. OSWatcher 的 netstat log 中显示 packet reassembles failed 指标增加,就可以考虑配置 Jumbo Frame 了。
1. 如何通过 Jumbo Frame 优化私网
Jumbo Frame 是指支持超过标准 MTU(1500 字节)的网络数据包,通常设置为9000 字节。
(1) 修改网卡 MTU 为 9000
在 Linux 系统中,临时修改私网eth1的 MTU 的命令如下:
[root@dbt01 ~]# ip link showeth1 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether fe:fc:fe:30:7c:a4 brd ff:ff:ff:ff:ff:ff[root@dbt01 ~]#[root@dbt01 ~]# ip link set dev eth1 mtu 9000 ##修改私网网卡MTU[root@dbt01 ~]# ip link show eth1 ##验证修改结果 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether fe:fc:fe:30:7c:a4 brd ff:ff:ff:ff:ff:ff
注意:两个节点都需要修改
(2) 永久修改 MTU
编辑网卡配置文件:
- Red Hat/CentOS
添加以下内容:sudo vi /etc/sysconfig/network-scripts/ifcfg-eth1
-
MTU=9000
重启网卡:
sudo ifdown eth1 && sudo ifup eth1
注意:两个节点都需要修改
2. 修改 Jumbo Frame 后如何验证效果
(1) 使用ping
命令测试 Jumbo Frame
测试节点间的网络是否支持 9000 字节的 MTU:
[root@dbt01 ~]# ping -c 4 -Mdo -s 8972 192.168.11.122
PING 192.168.11.122 (192.168.11.122) 8972(9000) bytes of data.
8980 bytes from 192.168.11.122: icmp_seq=1 ttl=64 time=0.887 ms
8980 bytes from 192.168.11.122: icmp_seq=2 ttl=64 time=0.492 ms
8980 bytes from 192.168.11.122: icmp_seq=3 ttl=64 time=0.546 ms
8980 bytes from 192.168.11.122: icmp_seq=4 ttl=64 time=0.557 ms
-Mdo
:强制不分片。
-s 8972
:ICMP 数据包大小(加上 28 字节头部等于 9000 字节 MTU)。
正常情况下,所有包都应返回成功。
如果没有启用成功 报错应该如下,提示message to long
[root@dbt01 ~]# ping -c 4 -Mdo -s 8972 10.229.43.142
PING 10.229.43.142 (10.229.43.142) 8972(9000) bytes of data.
ping: local error: Message too long, mtu=1500
ping: local error: Message too long, mtu=1500
ping: local error: Message too long, mtu=1500
(2) 检查网络统计信息
使用ifconfig
检查网卡统计信息:
[root@btdbt01 ~]# ifconfig eth1
eth1 Link encap:Ethernet HWaddr FE:FC:FE:30:7C:A4 inet addr:192.168.11.121 Bcast:192.168.11.255 Mask:255.255.255.0inet6 addr: fe80::fcfc:feff:fe30:7ca4/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:9000 Metric:1RX packets:853452922 errors:0 dropped:5 overruns:0 frame:0TX packets:708597428 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:724294742414 (674.5 GiB) TX bytes:510652307354 (475.5 GiB)
-
确保没有
RX
或TX
错误包。 -
验证网络数据包的传输正常。
(3) AWR 报告对比分析
启用 Jumbo Frame 后,重新生成 AWR 报告,比较RAC相关指标变化如GC类等待,interconnect statistics等
总结
尽管Jumbo Frames在大多数 交换机中广泛支持,但它并不是IEEE认可的标准。所以在实际操作中,建议与网络管理员协作,确保交换机和所有节点都支持Jumbo Frame,以避免网络不兼容问题。 在许多情况下,由于不正确的设置、驱动程序或交换机软件中的错误,可能会出现故障或不一致,从而导致次优性能和网络错误。基于这些考虑在做集群的Jumbo Frame优化时 建议谨慎操作,并和网络管理员深度沟通确认。
虽然有诸多限制,和可能得风险但是在oracle的官方文档中依然有如下的表述“There is some complexity involved in configuring Jumbo Frames, which is highly hardware and OS specific. The lack of a specific standard may present OS and hardware bugs. Even with these considerations, Oracle recommends using Jumbo Frames for private Cluster Interconnects.” 总之一句话虽然可能有诸多困难和问题,但是oracle 仍然建议在RAC集群中启用Jumbo Frame。
参考文档:
Recommendation for the Real Application Cluster Interconnect and Jumbo Frames (Doc ID 341788.1)
How to Modify Private Network Information in Oracle Clusterware (Doc ID 283684.1)
Troubleshooting gc block lost and Poor Network Performance in a RAC Environment (Doc ID 563566.1)
相关文章:
Oracle RAC最佳实践-优化私网连接
在 Oracle RAC 环境中,私网(Interconnect) 是节点之间通信和数据传输的关键部分。一直有个误解,认为私网(心跳网)只要能通随便什么交换机都可以,甚至有直连的,实际上私网的性能至关重要…...
[bug] StarRocks borker load意向之外的bug
意向之外,又清理之中 背景: StarRocks各方面碾压相同类型的数据库,最近我们要从生成HIVE导历史数据(ORC格式)到StarRocks,前期小测一下,在测试是没问题,上生产先导2个月的数据&…...
游戏AI实现-寻路算法(Dijkstra)
戴克斯特拉算法(英语:Dijkstras algorithm),又称迪杰斯特拉算法、Dijkstra算法,是由荷兰计算机科学家艾兹赫尔戴克斯特拉在1956年发现的算法。 算法过程: 1.首先设置开始节点的成本值为0,并将…...
9 OOM和JVM退出。OOM后JVM一定会退出吗?
首先我们把两个概念讲清楚 OOM是线程在申请堆内存,发现堆内存空间不足时候抛出的异常。 JVM退出的条件如下: java虚拟机在没有守护线程的时候会退出。守护线程是启动JVM的线程,服务于用户线程。 我们简单说下守护线程的功能: 1.日志的记录…...
Linux 端口操作
安装netstat yum -y install net-tools 检测端口占用 netstat -npl | grep "端口" 安装lsof lsof yum -y install lsof 检测端口占用 lsof -i :端口号 安装nc yum -y install nc 查看对方端口是否开放 nc -vz 对方ip 对方端口 安装telnet telnet yum -y in…...
【USB-HID】“自动化键盘“ - 模拟键盘输入
目录 【USB-HID】"自动化键盘" - 模拟键盘输入1. 前言2. 模拟键盘2.1 STM32CubeMX 配置2.2 修改代码配置2.3 发送按键信息 3. 接收主机Setup数据3.1 获取PC下发的数据 4. 总结 【USB-HID】“自动化键盘” - 模拟键盘输入 1. 前言 对于模拟键盘的实现,网…...
基于Spring Boot+Vue 的高校运动会管理系统
目录 1 绪论1.1研究背景1.2 研究意义1.3 相关开发技术简介1.3.1 Vue.js1.3.2 Spring Boot1.3.3 MySQL 2 系统分析2.1 需求分析2.1.1 功能需求2.1.2 非功能需求 2.2 系统可行性分析2.2.1 经济可行性2.2.2 技术可行性2.2.3 操作可行性 3 系统概要设计系统功能描述业务流程分析 4 …...
Linux应用程序中终止进程的几种方法
目录 1、正常退出进程的方法 1.1、exit(int status) 函数 1.2、_exit(int status) 函数 1.3、_Exit(int status) 函数 2、异常退出进程的方法 3、何时使用这些方法? 在 Linux 应用程序中,终止进程的方式有多种,通常取决于进程是否需要进…...
电脑文档损坏:原因剖析和修复方法
在使用电脑的过程中,许多用户可能会遇到文档突然提示损坏、无法打开的情况。这种情况的发生往往让人感到困惑,特别是当并未进行任何明显错误操作时。以下是一些常见的原因以及应对方法。 一、文档损坏的常见原因 1、非人为的异常操作: 在编…...
了解ARM的千兆以太网——RK3588
1. 简介 本文并不重点讲解调试内容,重点了解以太网在ARM设计中的框架以及在设备树以及驱动的一个整体框架。了解作为一个驱动开发人员当拿到一款未开发过的ARM板卡应该怎么去把网卡配置使用起来。 2. 基础知识介绍 在嵌入式ARM中实现以太网的解决方案通常有以下两种…...
【Nginx-4】Nginx负载均衡策略详解
在现代Web应用中,随着用户访问量的增加,单台服务器往往难以承受巨大的流量压力。为了解决这一问题,负载均衡技术应运而生。Nginx作为一款高性能的Web服务器和反向代理服务器,提供了多种负载均衡策略,能够有效地将请求分…...
低级计算机网络知识总结
1 应用层 1.1 HTTP(TCP) 浏览器访问WWW服务器过程:首先进行域名解析,然后通过TCP向服务器发送连接请求 HTTP本身是无连接,无状态的。无状态特性使服务器能够支持大量的并发HTTP请求。实际应用中,通常使用Cookie加数据库跟踪用户…...
linux sysrq的使用举例
在menuconfig中选择m和 *的区别: *: 模块驱动编译到内核中,启动时自动加载 M:标识作为内核模块编译 空格:表示该功能不编译到内核中,即新的内核将不支持该功能。 m:模块会被编译,但是不会被编译到内核中,只…...
数字IC后端设计实现篇之TSMC 12nm TCD cell(Dummy TCD Cell)应该怎么加?
TSMC 12nm A72项目我们需要按照foundary的要求提前在floorplan阶段加好TCD Cell。这个cell是用来做工艺校准的。这个dummy TCD Cell也可以等后续Calibre 插dummy自动插。但咱们项目要求提前在floorplan阶段就先预先规划好位置。 TSCM12nm 1P9M的metal stack结构图如下图所示。…...
Oracle 适配 OpenGauss 数据库差异语法汇总
背景 国产化进程中,需要将某项目的数据库从 Oracle 转为 OpenGauss ,项目初期也是规划了适配不同数据库的,MyBatis 配置加载路径设计的是根据数据库类型加载指定文件夹的 xml 文件。 后面由于固定了数据库类型为 Oracle 后,只写…...
【记录】Django解决与VUE跨域问题
1 梗概 这里记录Django与VUE的跨域问题解决方法,主要修改内容是在 Django 中。当然其他的前端项目 Django 也可以这样处理。 2 安装辅助包 pip install django-cors-headers3 配置 settings.py INSTALLED_APPS [ # ... corsheaders, # ... ] 为了响应…...
Yolov10本地部署,torch找不到GPU问题解决
在本地部署跑Yolov10的模型.具体分为以下几步,也是踩了一些坑: 1.YoloV10 代码拉取 2.安装CUDA 1.查看CUDA支持版本 2.下载安装CUDA 3.下载CUDNN 3.创建python虚拟环境 Anaconda下载安装 虚拟环境安装配置 4.运行 1.yoloV10代码拉取 源码地址: GitHub - THU-MIG/yolov10: YOLO…...
el-upload 上传文件 入参格式为form-data格式,入参字段为code、name、type、file(文件)的形式,如何实现?
el-upload 是 Element UI 中用于文件上传的组件。如果你需要上传文件并将其封装为 form-data 格式,并且包含字段如 code、name、type 和 file,你可以通过自定义 before-upload 或 action 进行处理。 1. el-upload 的基本用法 Element UI 的 el-upload …...
VUE组件插槽使用示例,弹窗样式
在Vue.js中,插槽(slots)是一种非常强大的功能,它允许你在父组件中向子组件传递内容。插槽主要有三种类型:默认插槽、具名插槽和作用域插槽。下面是一些示例来展示如何使用这些插槽。 默认插槽 默认插槽是最简单的插槽…...
ARM嵌入式学习--第八天(PWM)
PWM -PWM介绍 PWM(pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量,通信,工控等方面 PWM的频率 是指在1秒钟内,信号从…...
新能源汽车大屏可视化第三次数据存储
任务: 将数据存放到temp.csv 链接: 1.排行页面 https://www.dongchedi.com/sales 2.参数页面 https://www.dongchedi.com/auto/params-carIds-x-9824 完善打印: 1. [{‘series_id’: 5952, ‘series_name’: ‘海鸥’, ‘image’: ‘https://…...
linux 替换yum源镜像
1. 备份源镜像 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2. 下载国内镜像阿里云 如果没有wget可以用curl 代替 sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 清华大学 sudo wget -…...
SAP:如何修改已释放的请求
SAP:如何修改已释放的请求 QQ出了一个新功能,把10年前的旧日志推给自己。这个10年前的日志,是用户反映在SE10中把请求释放后发现漏了内容,想修改已释放的请求。经调查写了一个小程序,实现用户的需求。 *&-------------------…...
js的?. 和??和||有什么区别
let a 0; let b null; let c Hello;console.log(a ?? default); // 0 console.log(b ?? default); // "default" console.log(c ?? default); // "Hello"console.log(a || default); // "default" (因为 0 是假值) console.log(b |…...
clickhouse 分布式表创建、增加、更新、删除、查询
创建分布式表 --先创建本地表 设置自动过期时间3天 CREATE TABLE IF NOT EXISTS ck_database.ck_databaseon cluster default(cluster name) (table_id String COMMENT id,item_id String COMMENT 业务id,desc Int64 COMMENT 描述,time DateTime DEFAULT now() COMMENT 数据…...
推送本地仓库到远程git仓库
目录 推送本地仓库到远程git仓库1.1修改本地仓库用户名1.2 push 命令1.3远程分支查看 推送本地仓库到远程git仓库 删除之前的仓库中的所有内容,从新建库,同时创建一个 A.txt 文件 清空原有的远程仓库内容,重新创建一个新的仓库,…...
LSTM长短期记忆网络
LSTM(长短期记忆网络)数学原理 LSTM(Long Short-Term Memory)是一种特殊的递归神经网络(RNN),解决了标准RNN中存在的梯度消失(Vanishing Gradient) 和**梯度爆炸&#x…...
ABAP SQL 取日期+时间最新的一条数据
我们在系统对接的时候,外部系统可能会推送多个数据给到我们。 我们 SAP 系统的表数据中日期和时间是作为主键的,那么如果通过 ABAP SQL 取到最新日期的最新时间呢。 解决方案: 方式 1:SELECT MAX 可以通过两个 SELECT MAX 来取…...
SAST静态应用安全测试常见的编码规则
行业优先级难易度标准标准名称数量 军工12易GJB 5369:2005GJB_5369(国家军用标准航天型号软件C语言可靠性编程规范)138军工行业最早的C语言编码标准,强制性4易GJB 8114:2013GJB_8114(国家军用标准C/C语言可靠性编程规范ÿ…...
AI相关专业名词汇总解释
1.SFT Supervised fine-tuning,“有监督微调”意味着使用有标签的数据来调整一个已预训练好的语言模型(LLM),使其更适应某一特定任务。通常LLM的预训练是无监督的,但微调过程往往是有监督的。 详解:https:/…...
【C语言】指针数组和数组指针
前言 指针数组和数组指针是C语言中经常混淆的两个概念,虽然他们的名字相似,但其含义却完全不同。 指针数组 指针数组本质是一个数组,特点是数组中的元素均为指针,其定义形式为: 数据类型 *指针名[长度] 例如 int *…...
联邦学习中:公共物品属性的一般定义
在经济学和相关领域中,公共物品属性具有特定的含义,在论文中与联邦学习数据交易等情境相关联时,其意义如下: 公共物品属性的一般定义 非排他性 公共物品一旦被提供,很难或不可能排除其他人使用。例如,路灯照亮了街道,一个人使用路灯照明并不会阻止其他人同时使用,无法…...
前端的Python应用指南(一):快速构建 Web 服务器 - Flask vs Node.js 对比
随着前端开发技术的不断发展,前端开发者的技术栈也在不断扩展。如今,前端开发者不仅要掌握 HTML、CSS、JavaScript,还要掌握后端技术,成为全栈开发者。而在后端技术的选择上,Python 和 Node.js 是两种非常流行的选择。…...
典型案例 | 旧PC新蜕变!东北师范大学依托麒麟信安云“旧物焕新生”
东北师范大学始建于1946年,坐落于吉林省长春市,是中国共产党在东北地区创建的第一所综合性大学。作为国家“双一流”建设高校,学校高度重视教学改革和科技创新,校园信息化建设工作始终走在前列。基于麒麟信安云,东北师…...
【UE5】pmx导入UE5,套动作。(防止“气球人”现象。
参考视频:UE5Animation 16: MMD模型與動作導入 (繁中自動字幕) 问题所在: 做法记录(自用) 1.导入pmx,删除这两个。 2.转换给blender,清理节点。 3.导出时,内嵌贴图,选“复制”。 …...
ROS+PX4+Gazebo仿真环境配置全流程解析
上一期文章介绍了我们即将发布的仿真平台,并提到后续需要在Ubuntu系统上进行PX4软件在环仿真。本期文章将为大家详细介绍如何配置Ubuntu环境以及安装ROS和PX4仿真环境。具体配置包括:Ubuntu 20.04 ROS Noetic PX4 Python3。 需要注意的是,…...
STM32F103单片机HAL库串口通信卡死问题解决方法
在上篇文章 STM32F103单片机使用STM32CubeMX创建IAR串口工程 中分享了使用cubeMX直接生成串口代码的方法,在测试的过程中无意间发现,串口会出现卡死的问题。 当串口一次性发送十几个数据的时候,串口感觉像卡死了一样,不再接收数据…...
基于微信小程序的电影院订票选座系统ssm+论文源码调试讲解
第2章 开发环境与技术 本章节对开发基于微信小程序的电影院订票选座系统需要搭建的开发环境,还有基于微信小程序的电影院订票选座系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始…...
解决新安装CentOS 7系统mirrorlist.centos.org can‘t resolve问题
原因 mirrorlist.centos.org yum源用不了 解决办法就是 # cd /etc/yum.repos.d/ # mv CentOS-Base.repo CentOS-Base.repo_bak # vim CentOS-Base.repoCentOS系统操作 # mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/*.repo_bak # curl -o /etc/yum.repos.d/CentOS-Linux-Ba…...
分布式系统架构3:服务容错
这是小卷对分布式系统架构学习的第3篇文章,虽然知道大家都不喜欢看纯技术文章,写了也没多少阅读量,但是个人要成长的话,还是需要往深一点的技术上去探索的 1.为什么需要容错 分布式系统的本质是不可靠的,一个大的服务…...
鸿蒙项目云捐助第十四讲云函数的初步使用
鸿蒙项目云捐助第十四讲云函数的初步使用 在开发项目的过程中,云端充分利用已成为一种驱势。云监控,云运维,云开发,云办公等等软件层出不穷,本地软件云端化也成为一种潮流。在这股大潮中,华为云也是独树一…...
【5G】5G的主要架构选项
最初,在3GPP讨论中考虑了所有可能的聚合和核心网络组合,共有八个架构选项。以下重点介绍option2、3、4和7。 1. 独立组网 (Standalone, SA) 架构选项 2 :Standalone architecture with 5G-core 特点: 5G核心网(5GC, …...
【Laravel】端口问题导致菜单打不开
以下是修改 Laravel 应用程序的端口配置, 修改环境变量 APP_URL 来实现 app/Providers/AppServiceProvider.php <?phpnamespace App\Providers;use Illuminate\Events\Dispatcher; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\URL…...
网络安全等级保护系统定级流程与示例
一、定级流程 安全保护等级初步确定为第二级及以上的等级保护对象,其运营使用单位应当依据《网络安全等级保护定级指南》进行初步定级、专家评审、主管部门审批、公安机关备案审查,最终确定其安全保护等级。 二、定级方法 等级保护对象的级别由两个定级…...
项目练习:若依-ruoyi系统的部署与运行(前后端分离版)
文章目录 一、我的环境二、代码下载三、数据库配置四、项目配置文件修改五、启动运行六、验证 一、我的环境 jdk:8 MySQL:5.7 Redis: nodejs:v16.13.2 npm:8.1.2 vue:5.0.8 开发工具 idea Navicat for MyS…...
【UE5 C++课程系列笔记】10——动态单播/多播的基本使用
目录 概念 申明动态委托 一、DECLARE_DYNAMIC_DELEGATE 二、DECLARE_DYNAMIC_MULTICAST_DELEGATE 绑定动态委托 一、BindDynamic 二、AddDynamic 三、RemoveDynamic 执行动态委托 一、Execute 二、ExecuteIfBound 三、IsBound 四、Broadcast 动态单播使用示…...
Netcat:网络中的瑞士军刀
免责声明:使用本教程或工具,用户必须遵守所有适用的法律和法规,并且用户应自行承担所有风险和责任。 文章目录 一、引言二、简述三、Netcat功能?四、参数选项五、Netcat 的常见功能六、高级用法多连接处理创建简单的代理 七、Netc…...
清理C盘小记
突然C盘就爆满了,想当初还是给他预留了120G的空间,感觉到现在也不够用了,担心出现死机的情况就赶紧进行了清理。有一说一,清理回收站是真的有用。 参考:C盘清理指南,清理出30G起,超详细总结&am…...
Qt WORD/PDF(四)使用 QAxObject 对 Word 替换(QWidget)
关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF(二…...
软件工程 设计的复杂性
复杂性代表事件或事物的状态,它们具有多个相互关联的链接和高度复杂的结构。在软件编程中,随着软件设计的实现,元素的数量以及它们之间的相互联系逐渐变得庞大,一下子变得难以理解。 如果不使用复杂性指标和度量,软件…...