【问题标题】:Large srt* file in progress 4gl正在处理的大型 srt* 文件 4gl
【发布时间】:2014-04-09 08:32:08
【问题描述】:

Progress 版本 11.0 srt* (srt) 排序/临时文件在 RHEL Linux 6.0 中变得非常大。隔离到与 webspeed 一起用于 Web 应用程序的特定数据库。使用 -T 开关参数来定义文件的位置。不使用 -t 使文件断开连接并且不显示在文件系统上。

在 shell 中执行 lsof 显示文件增长到 GB 大小并不断增加。第三列是字节大小:

_mprosrv 29968 3862790144 /usr/temp/srtJrjsxX(已删除)

_mprosrv 31588 15290187776 /usr/temp/srtVEi9Lp(已删除)

_mprosrv 32644 1533157376 /usr/temp/srtTozP1W(已删除)

_mprosrv 32667 3890683904 /usr/temp/srte5qI1U(已删除)

有没有办法限制这些临时文件的大小或阻止它们变得如此之大?

【问题讨论】:

    标签: progress-4gl webspeed


    【解决方案1】:

    如果您使用的是 11.0,请考虑升级到 11.2 或更高版本。

    显然存在一个错误(称为缺陷 OE00227173,已在 11.2 中修复),其中一些大型查询会导致 _mprosrv 进程不断增长其 .srt 文件,而不是按照应有的方式重用文件空间。

    来自发行说明:

    问题编号:OE00227173 每次执行查询时,临时排序文件都会增长

    当运行在单词索引中有任何通配符的搜索时,搜索 将在 db 服务器上创建一个 srt 文件。如果查询返回大 行数(大于 100,000)然后排序文件中的空间不是 完全重复使用,.srt 可以变得非常大。

    通过断开用户会话与相关服务器 PID 的连接,然后终止服务器进程(最好使用 promon R&D,4,7,7),可以找到临时缓解。

    通过服务器 PID 获取用户的代码:

    def var v-pid as int format ">>>>>>>>>9" label "Server PID" no-undo.
    
    do while true:
        update v-pid with frame f1 side-labels.
    
        find _server where _server._server-pid eq v-pid
            no-lock no-error.
        disp _server with frame f2.
    
        for each _connect where
            _connect._Connect-Server eq _server._server-num  /** NOT _server-id **/
            no-lock:
    
            find _userio where _connect._connect-id eq _userio._userio-id
            no-lock no-error.
    
            disp _connect._Connect-Usr /** NOT _Connect-Id **/
                 _connect._Connect-Name
                 _connect._Connect-Device
                 _connect._Connect-Time
                 _connect._Connect-Pid
                 _userio._userio-dbaccess
                 _userio._userio-dbread
                 _userio._userio-dbwrite.
    
        end.
    end.
    

    【讨论】:

    • 听起来像这样解决了我们遇到的确切问题。在单词索引中使用通配符进行搜索时,我们可以看到文件增长。谢谢
    • 还意识到,作为一种临时措施,您可以停止具有特别大的 srt 文件的服务器进程以释放该磁盘空间。 (直接杀死或promon R&D,4,7,7...)当然,连接到该服务器的任何用户都可能断开连接,直接杀死服务器进程可能会使数据库崩溃。最好先断开用户与相关服务器 PID 的连接[可能在系统的安静时间,如果存在的话]。
    【解决方案2】:

    不,没有参数可以限制它们。了解您正在做什么以促进增长是关键。通常它们是缺少适当索引的查询的结果,因此必须由客户端选择和排序记录。

    我愿意:

    • 在客户端上启用 -t 以便您可以实时监控 SRT 文件的增长。
    • 启用客户端语句缓存,以便您可以确定在发生增长时对哪个源模块中的哪一行代码负责的查询。
    • 使用 XREF 和 DEBUG 进行编译,以便您可以查看代码以进行表扫描(XREF“整个索引”引用)并从语句缓存信息中查找(调试)源代码行
    • http://dbappraise.com/protop.html 下载 ProTop 3,以便实时监控查询活动
    • 将 -noautoresultlist 参数添加到您的客户端启动中(它不是灵丹妙药,但在某些情况下可能会有所帮助)
    • 如果您碰巧在未启用客户端语句缓存的情况下“在执行中”捕获客户端,请发送“kill -USR1”,然后在 protrace 中查找并检查 4gl 堆栈跟踪。 (可能在客户端的启动目录中)

    【讨论】:

    • 查看了以下进度文章knowledgebase.progress.com/articles/Article/P95930?popup=true 对确定实际导致增长的代码/查询有什么帮助吗?
    • 我会启用客户端语句缓存、PROMON、R&D、1、18
    • 一旦与 SRT 文件关联的 PID 变得太大以便可以回收它们的空间,是否会产生任何副作用?看起来一旦被杀死,文件就会在应用程序中的查询被执行时重新创建。
    • 真正的问题是什么?文件对于您的存储来说是否太大?是否有广泛的光盘io?杀死 pid 将杀死正在进行的任何处理。尝试识别查询 - 看看它们是否可以更改,或者是否可以在数据库中更改索引。
    • 正确。文件的大小对于存储来说太大了,从而耗尽了它们所在卷上的所有可用空间。由于文件大小没有限制,因此无法确定文件可以有多大,因此很难为它们分配足够的存储空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多