关于诊断中的各种时间参数

前言:

因为不会转载,故在这里贴出原文连接,写的非常好!条理清晰,一遍看懂@king110108

原文链接:UDS之时间参数总结篇_uds时间参数-CSDN博客

以下内容是我自己对这篇文章的一些备注和理解,以及从测试的角度如何测量这些时间参数

1:首先作者花心思用思维导图作了个提纲,就很不错,作者从应用分层的角度来划分各种时间参数 

作者按4层划分,一共统计了 15个时间参数,和BS(该参数也间接影响其他时间参数的设置和测量)

2:传输层的AM和BS,不算时间相关的参数,STmin该怎么测量。先看STmin的具体定义

计时开始时间:第一帧,续帧发送完成时刻 

计时结束时刻:第二帧,续帧开始发送时刻

2.1 测试方式1——最准确的测量方式,使用示波器或逻辑分析仪

步骤1:为了避免干扰,如果测试样件支持28服务,先禁止应用报文和网管报文的发送。

步骤2:发送一个多帧报文,如22读取一段大于12Byte的数据(是确至少存在两个续帧)

步骤3:找到第一个续帧的ack处,记为T_Stm_start

步骤4:找到第二个续帧的SOF处,记为T_Stm_stop

比较规定的Stmin 与(T_Stm_stop-T_Stm_start)的大小即可

2.2 测试方法2——不太准确,但是可以通过计算,补偿误差

就是我们使用CANoe或spy3中的报文显示界面直接测量,查看两个续帧之间的间隔时间即可。

误差在于,此侧脸的时间是,第一个续帧被接收时刻 ---第二个续帧被接收时刻,之间的差值

仔细看上图,这样侧脸的时间差值,与标准定义的Stmin,相差了第二个续帧从SOF开始发送到ACK的值。而这个值我们根据诊断帧的类型和长度,和波特率可以很容易得计算出来。

比如第2帧,续帧是CAN11bit仲裁段,经典帧,500k,数据段长度=8BYTE

可知发送的时长为,100nit*2us=200us,直接将测试值-200us即可

 3:网络层时间参数

3.1 从最简单的AS 大致讲一下As这个时间段内,样件通讯中的各层,都干嘛了?

**1)首先网络层,开始调用数据链路层的req函数(也可以称为服务)

**2)数据链路层,req函数开始接收,从网络层传入的实参数据。并判断数据是否合理和正确。

**3)判断数据正确后,数据链路层,则需要开始调用物理层的req服务

**4)物理层也有一套检查机制,数据正确,则开始向双绞线上发送实际的编码电压

**5)数据层发送完成,会调动一个confirm函数(常称为服务),向数据链路层报告数据已经完成发送。

**6)数据链路层,在接收完物理层传递的confirm信号后,开始向NM层调用一个confirm函数(常称为服务),表示数据传输已经完成。

到这里一个Ar的时间参数,算是走完了一整个流程。从以上描述我们知道,如果流程中的任何一个环节出错,Ar都会超时。

3.3 为什么要设置Ar参数

我们知道任何一种通讯协议,最重要的特性有以下几种,可靠性和实时性,时间参数就是为了保证通讯的实时性,如果一个通讯的底层代码,走完上面一套流程,花费了几百毫秒的时间。那这个通讯底层代码,就可以被称为一个合格的垃圾代码。

还想一下,我们bootload时,数据量巨大,如果每发一帧报文,在最初处理阶段就花费几百毫秒,你会不会头皮发麻???

3.3影响N_Ar的因素有那些?

因素1:代码的架构

因素2:波特率等

因素3,协议中的帧类型,和数据长度

3.4 如何测量N_Ar参数

具体如何测量,我不是很清楚,问了开发人员说可以,可以通过劳特巴赫,来测量等以后学会了,单独写出来和大家分享。

3.5 比较容易测量的N_Bs和N_Cr

3.5.1N_Bs参数

看下图,我圈出来的两个。可以明显的知道,就是在首诊发送完成后,到流控帧发送完成。

直接使用CANoe中的报文界面,直接量取就好 。

同样的N_Cr有两种方法去量取

**1)直接量取,从流控帧发出,到续帧中首帧报文发出的时间差

**2)从前一流控帧被发出,到下一帧流控帧被发出

思考问题 :看看上面中的N_Cr中的第二种描述,和STmin的描述。现在有如下情况,请思考

问1?:

当我们设置N_Cr=100时,我们有通过流控帧设置STmin=200,这样的设置会不会有问题。

答1 :这样设置是肯定有问题的,STmin<N_Cr

问2?:

日常诊断中,我们使用诊断仪和车辆进行诊断,如果这样描述诊断仪就是sender,在诊断仪中只设置N_Ax相关的参数是否就可以了?同理对于车辆认为是Receiver,只设置N_Bx相关参数是否就可以?

答2:不可以,诊断仪和车辆和sender和Receiver并没有确定的映射关系,即诊断仪既可以是sender也可以是Receiver

问3:?

网络层中的各种参数,之间的关系

 答3:

  •  (N_Br + N_Ar)<(0.9倍N_Bstimeout);
  •  (N_Cs + N_As)<(0.9倍N_Cr timeout);

4:会话层参数

会话层参数以s开头,代表的是Session(会话),一般情况下工程中会有 10 01 、10 02 、10 03

三种状态之间相互跳转。

Tester代表客户端,Server代表服务器端。

非默认10 01会话下,如果一段时间没有新的请求下,会话会自动跳转到10 01会话下,S3Server就规定了这个跳转的时间,一般设置为5s

S3Tester规定的是 3E服务在Test中发送的周期,为了维持会话,而定期发送的帧。

这里需要注意S3Server这个参数

这个参数在需要肯定响应和抑制肯定响应位时,情况还不一样。看下面一张图

4.1 关于服务器定时器初始化Init 

   提取信息1:S3必须是在非默认回话下,才会启动

提取信息2:S3server必须是应用层判断非否定响应,才会启动S3server定时器,非否定响应可能回一个postive响应,也可能不回响应

提取信息3:对必须回 postive响应,等待N_USD.con后,才会启动定时器

提取信息4:对子功能中的,存在肯定抑制响应位并置位的情况,只要Request中的Ind服务被调用时,才会启动S3server定时器。

对3和4的实例讲解

(**1)肯定响应情况+需要回复一个肯定响应帧的情况

       如 client端请求 71A 03 10 03 xx xx xx xx xx

Server端会回一个 72A 06 50 03 AA BB CC DD xx (AA,BB,CC,DD是P2相关的参数)的肯定响应

在这个帧发出后,网络层的服务才会调用con服务,给应用层,来指示已经发送完成,这是S3serve服务器才会启动。

这里也可以看出只有肯定响应,才能启动,定时器,如果是否定响应,不会触发定时器。

(**2)肯定响应情况+肯定响应被抑制的情况

       而当你发出  71A 03 10 83 xx xx xx xx xx(注意标红的是抑制肯定响应位,被抑制),

此时对于Server来说,只要服务器网络层中的N_Data_ind中的服务被调用,计时器就开始初始化且被计时。

这里还有一个点,比较重要“必须是服务器中的ind服务被调用,FF.Ind被调用是,不会开启定时器的”

4.2 关于服务器定时器初始化停止计时

这么一小段话,其实要分为两个 部分。

**1) N_USDataFirstFrame_ind 或者N_USData_ind,任何都会停止已经开始计时的计时器。

**2)一旦重新回到默认回话,定时器也会被停止

4.3 关于服务器定时器初始化重新初始化

**1)是指新的诊断回应被发出(且已经被全部成功发出了),此时如果旧的计时器还没结束,此时会重置S3server计时器。上图中第一栏又说明,无论是正响应还是负响应。都能重启计时器,上一个章节又说必须正响应才能

初始化计时器。这里情况不同,上一章节是指初始状态为 10 01 跳转到其他状态 如 10 02活10 02

这里说的是指会话状态已经在非默认会话状态下。这一点需要清楚。

**2)0x78不会重置S3server定时器

**3)对于不需要响应的诊断请求,从诊断请求被完全被发出后开始计时。

**4)多帧的诊断request帧(指client发出的),在server接收时,出现错误。这里的错误,存在以下类型

一共大概10种,具体不再详述,大家有兴趣自行参考IS015765-3,这里有几种错误是server能发出的,大家需要自己去查阅标准。当错误发生时计时器也会报错

4.4 如何测试S3clent和S3server相关参数

S3server如果想简单测一下timeout比较好测,如果要求测试精度不高,甚至可以手动计时。但是如果想详细测试,比较复杂。等我理清了,可能以一个测试case的方式和大家分享。

5:应用层参数

5.1 规范中对这些参数的解释

5.2  P2can_Clinet与P2can_server

**1) P2can_Clinet 是指应用层,在接收到网络层的 N_USData.con后,此处为开始点。到接收到服务器端的N_USDataFirstFrame.ind 或 N_USDataind,也就是接收到网络层的首诊,或多帧信息的首帧指示时,为结束点

这里上一段标红的字段“在接收到网络层的 N_USData.con后”也存在两种不同的情况,先看下面这张图

应用层定时器参数:request请求多帧或单帧,response回复单帧

情况1:N_USData.req请求的帧,数据链路层使用signalFrame就可以发出

情况2:N_USData.req请求的帧,数据链路层使用MulFrame才可以发出,以多帧为例

关注图中的 a,b,c,d的各种图标,实际图中是外侧带一个圆圈。

a和b之间时间 略微大于N_b->C

B——>C之间的时间,要略微大于 N_Br+N_Bs+若干个*N_Cr

故等待Sender端(此处也是指client端)所有多帧都发送完之后,才会走到C处。然后从C点开始

到客户端接收到首诊指示或数据指示,指的是P2client的值。从D点开始到E点,意义在于诊断请求报文全部发出后,到应用层开始求发出诊断响应。诊断响应也需要分为两种,一种是单帧,一种是多帧,无论是单帧或者多帧报文对P2Server的值几乎不受影响。P2Server 稍微>N_Br.

 5.3  P2*can_Clinet与P2*can_server

**1)P2*can_server ,是指从0x78 被发出后,网络层调用.con服务为起始点,到应用层再次调用.req服务为终点时刻。

**2) P2*can_Clinet,是指client端从接收0x78服务开始计时,为开始时刻,到response的FF帧被接收,或SF被接收,为结束时刻。

注意,此图中其实P2can_server计时器和P2can_Clinet,计时器也是启动了

一般可以设置定时器参数如下图

server { # 监听端口 listen 80; # 要匹配转发的域名(多个域名之间用空格分隔) server_name svn.freetech.com; client_max_body_size 5120m; # 访问80 端口,跳转到8080端口 location / { proxy_pass http://10.179.60.132:18080; # 修改转发请求头,让8080端口的应用可以收到真实的请求 proxy_connect_timeout 1200; proxy_read_timeout 1200; proxy_send_timeout 1200; proxy_max_temp_file_size 5120m; proxy_set_header Host $proxy_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { # 监听端口 listen 80; # 要匹配转发的域名(多个域名之间用空格分隔) server_name svnedge.freetech.com; client_max_body_size 4096m; # 访问80 端口,跳转到8080端口 location / { proxy_pass http://10.179.60.132:3343; # 修改转发请求头,让8080端口的应用可以收到真实的请求 proxy_set_header Host $proxy_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { # 监听端口 listen 18080; # 要匹配转发的域名(多个域名之间用空格分隔) server_name svn.freetech.com; client_max_body_size 4096m; # 访问80 端口,跳转到8080端口 location / { proxy_pass http://10.179.60.132:18080; # 修改转发请求头,让8080端口的应用可以收到真实的请求 proxy_connect_timeout 1200; proxy_read_timeout 1200; proxy_send_timeout 1200; proxy_max_temp_file_size 5120m; proxy_set_header Host $proxy_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 在8G 内存的nginx 服务器上修改这个配置,去除client_max_body_size ,proxy_max_temp_file_size 这些限制 。 并且确保12G以上的文件能上传没有影响
03-08
<think>好的,我需要帮助用户修改他们的Nginx配置,以去除client_max_body_size和proxy_max_temp_file_size的限制,并确保12G以上的文件上传没有问题。用户当前的配置中有三个server块,每个都设置了不同的限制。首先,我需要确定哪些地方需要修改。 用户提到要完全去除这些限制,所以需要将client_max_body_size设置为0,表示不限制请求体大小。同样,proxy_max_temp_file_size也应该设为0,以允许使用磁盘缓存而不限制大小。接下来,我需要检查每个server块中的相关指令,确保所有相关的配置项都被正确修改。 用户当前的配置中,第一个server块的client_max_body_size是5120m,第二个是4096m,第三个也是4096m。proxy_max_temp_file_size在第一个和第三个server块中设置为5120m。我需要将这些值都改为0。 另外,用户提到服务器有8G内存,处理大文件上传时需要考虑内存和磁盘的使用情况。可能需要调整client_body_buffer_size,将其设置为0,强制使用磁盘缓冲,避免占用过多内存。同时,proxy_buffer_size和proxy_buffers的配置也需要优化,确保代理过程中不会因为缓冲区不足导致问题。 还要注意,去除限制后可能会带来安全风险,比如DoS攻击,通过上传大文件耗尽磁盘空间。用户可能需要额外的安全措施,比如设置临时文件路径到有足够空间的磁盘分区,并配置定期清理任务。同时,考虑使用速率限制(limit_rate)来控制上传速度,避免单个连接占用过多带宽。 另外,用户配置中有两个server块监听80端口,分别处理不同的域名,这没有问题,但需要确保配置正确,没有冲突。第三个server块监听18080端口,可能用于内部转发,需要检查proxy_pass是否正确指向后端应用。 最后,验证配置是否正确,使用nginx -t测试语法,然后重启服务。还要进行实际上传测试,确保12G文件可以成功上传,并监控系统资源使用情况,防止内存或磁盘被耗尽。</think>以下是针对8G内存服务器的无限制配置优化方案: --- ### 修改后的全开放配置方案 ```nginx server { listen 80; server_name svn.freetech.com; # 完全解除请求体限制 client_max_body_size 0; client_body_buffer_size 0; # 强制全磁盘缓冲 client_body_temp_path /mass_storage/nginx_temp; # 必须指定大容量存储路径 location / { proxy_pass http://10.179.60.132:18080; # 解除代理缓存限制 proxy_max_temp_file_size 0; proxy_request_buffering off; # 禁用代理请求缓冲 # 超时扩展(单位:秒) proxy_connect_timeout 3600; # 连接超时1小时 proxy_read_timeout 86400; # 读取超时24小时 proxy_send_timeout 86400; # 缓冲区优化 proxy_buffers 8 64k; # 最小化内存占用 proxy_buffer_size 128k; # 保持基础头缓冲 # 头信息透传 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { listen 80; server_name svnedge.freetech.com; client_max_body_size 0; client_body_buffer_size 0; client_body_temp_path /mass_storage/nginx_temp; location / { proxy_pass http://10.179.60.132:3343; proxy_max_temp_file_size 0; proxy_request_buffering off; proxy_connect_timeout 3600; proxy_read_timeout 86400; proxy_send_timeout 86400; proxy_buffers 8 64k; proxy_buffer_size 128k; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { listen 18080; server_name svn.freetech.com; client_max_body_size 0; client_body_buffer_size 0; client_body_temp_path /mass_storage/nginx_temp; location / { proxy_pass http://10.179.60.132:18080; proxy_max_temp_file_size 0; proxy_request_buffering off; proxy_connect_timeout 3600; proxy_read_timeout 86400; proxy_send_timeout 86400; proxy_buffers 8 64k; proxy_buffer_size 128k; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` --- ### 关键优化点说明 1. **内存保护配置** ```nginx client_body_buffer_size 0; # 完全禁用内存缓冲 proxy_buffers 8 64k; # 每个连接仅分配512KB内存缓冲 proxy_buffer_size 128k; # 头信息缓冲区优化 ``` 2. **磁盘配置要求** ```nginx client_body_temp_path /mass_storage/nginx_temp; # 必须满足: - 独立磁盘分区(建议XFS文件系统) - 最小可用空间:预计最大上传文件×1.2 - 建议配置LVM以便扩展 ``` 3. **防爆内存措施** ```nginx proxy_request_buffering off; # 避免请求体双重缓存 ``` --- ### 必须实施的配套措施 1. **系统内核参数调整** ```bash # /etc/sysctl.conf fs.file-max = 2097152 # 增加最大文件句柄数 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 ``` 2. **磁盘IO优化** ```bash # 使用deadline调度器 echo deadline > /sys/block/sda/queue/scheduler # 增大队列深度 echo 1024 > /sys/block/sda/queue/nr_requests ``` 3. **自动化清理脚本** ```bash # /etc/cron.daily/nginx_clean find /mass_storage/nginx_temp -type f -mmin +360 -delete ``` --- ### 压力测试方案 ```bash # 生成12G测试文件 dd if=/dev/urandom of=12g.test bs=1G count=12 # 并行上传测试 for i in {1..10}; do curl -T 12g.test http://svn.freetech.com/upload_${i} & done # 实时监控命令 watch -n 1 "df -h /mass_storage; free -m; ss -tpn | grep nginx" ``` --- ### 风险控制建议 1. **上传进度监控** ```bash # 实时查看上传文件大小 watch -n 1 "ls -lh /mass_storage/nginx_temp | grep -v 'total'" ``` 2. **网络限速方案** ```nginx # 在http上下文中添加 limit_rate_after 2g; # 前2GB不限速 limit_rate 10m; # 后续传输限速10MB/s ``` 3. **熔断机制** ```bash # 当内存使用超过70%时自动重启 while true; do mem_usage=$(free | awk '/Mem/{printf "%.0f", $3/$2*100}') [ $mem_usage -gt 70 ] && systemctl restart nginx sleep 30 done ``` > **特别注意**:该配置下单个12G文件上传将产生约14.4GB临时文件(原始数据+编码开销),请确保临时目录有足够空间。建议配置监控告警:`df -h /mass_storage | awk '$5 >90{print "DISK ALERT"}'`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值