EDA - s家的dc_shell-t read缓冲区大小不同引起的问题

2024-03-29 07:38

本文主要是介绍EDA - s家的dc_shell-t read缓冲区大小不同引起的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

EDA - s家的dc_shell-t read缓冲区大小不同引起的问题

问题描述

在CentOS 7上执行dc_shell-t -topo -64bit进入shell后,source /path/to/tcl.tl,还在source的过程中使用另一台服务器执行svn up /path/to/tcl.tl,接着该source过程就报错退出。而在CentOS 6上该flow是能正常完成的。

问题分析

testcase

人工写一个/path/to/tcl.tl,里面内容为

#!/usr/bin/tclsh
after 2000
puts "echo point 01"
after 2000
puts "echo point 02"
## ... 100 times here, snippet ommitted ... ##
after 2000
puts "echo point 02"

test

分别在CentOS 6与CentOS 7上启动dc_shell-t,按照问题描述中的flow走,发现在6上确实没问题,在7上会报错

information: script "/path/to/tcl.tl":
stopped at line 100 due to EOF

于是在走flow前,分别在6和7上都使用strace命令追踪dc_shell-t进程,然后开始走flow。经查看strace日志发现,

OSdc_shell-t’s read buffer sizetcl脚本读取与执行顺序
CentOS 665536read一次就执行一次。循环往复,直到内容被读完执行完。
CentOS 78192同上

检查被source的/path/to/tcl.tl脚本,大小为10000多字节。对照上面的表格,可以看出在6上可以一次被load进内存并执行,而在7上则先load前面的8192字节,待执行完后再load剩余部分。由于在第一次执行期间,该脚本就被另一台机器执行svn up更新了。虽然文件还在,但更新后的文件inode变了,原inode丢失了,内核中维护的file handle失效,变成了Stale file handle。当dc_shell-t再次要读取剩余脚本时遭遇了Stale file handle,报错EOF并退出。

为了对照,我又运行tclsh 8.6.11解析器,来看看原生的tcl的行为

OStclsh’s read buffer sizetcl脚本读取与执行顺序
CentOS 64096多个read一次性将脚本内容读进内存,然后开始执行。
CentOS 74096同上

在测试时,发现如果使用if分支的花括号,将大于buffer size的内容包进来,在测试时dc_shell-t也会有像tclsh一样的行为:同一个语句块内的内容将被多个read一次性将脚本内容读进内存,然后开始执行

解决方案

  1. 在跑该flow过程中,尽量不使用任何方式更新正在跑的文件
  2. 假设不可避免要更新正在跑的文件,则可以在同一台机器上更新它。因为同一台机器更新NFS的文件时,正在被open的原inode的文件rename成.nfs*****这样的文件,原来的file handle就还有效,这样flow就不会报错退出;
  3. 假设不可避免要更新正在跑的文件,则可以使用花括号将全部业务逻辑包起来,让解析器认为它属于同一个语句块,以便一次性加载到内存中

TO-DO

需要与厂商确认,看6与7上,为何工具的同一个命令调用的系统调用read,buffer size传参值却不一样。

写在后面

dc_shell使用的是原生格式的厂家特定语言,而dc_shell-t使用的是标准的tcl语言格式。

资料参考

https://link.springer.com/chapter/10.1007%2F0-306-47507-3_3
https://zhuanlan.zhihu.com/p/129059203

这篇关于EDA - s家的dc_shell-t read缓冲区大小不同引起的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/858009

相关文章

Linux部署中的文件大小写问题的解决方案

《Linux部署中的文件大小写问题的解决方案》在本地开发环境(Windows/macOS)一切正常,但部署到Linux服务器后出现模块加载错误,核心原因是Linux文件系统严格区分大小写,所以本文给大... 目录问题背景解决方案配置要求问题背景在本地开发环境(Windows/MACOS)一切正常,但部署到

MySQL磁盘空间不足问题解决

《MySQL磁盘空间不足问题解决》本文介绍查看空间使用情况的方式,以及各种空间问题的原因和解决方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录查看空间使用情况Binlog日志文件占用过多表上的索引太多导致空间不足大字段导致空间不足表空间碎片太多导致空间不足临时表空间

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

Java中InputStream重复使用问题的几种解决方案

《Java中InputStream重复使用问题的几种解决方案》在Java开发中,InputStream是用于读取字节流的类,在许多场景下,我们可能需要重复读取InputStream中的数据,这篇文章主... 目录前言1. 使用mark()和reset()方法(适用于支持标记的流)2. 将流内容缓存到字节数组

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

解决Failed to get nested archive for entry BOOT-INF/lib/xxx.jar问题

《解决FailedtogetnestedarchiveforentryBOOT-INF/lib/xxx.jar问题》解决BOOT-INF/lib/xxx.jar替换异常需确保路径正确:解... 目录Failed to get nested archive for entry BOOT-INF/lib/xxx

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3