Project

General

Profile

Actions

追加功能 #503

closed
XF XF

v4.0: 系统奔溃 - 反思和防止

追加功能 #503: v4.0: 系统奔溃 - 反思和防止

Added by Xihua Fan 2 months ago. Updated about 2 months ago.

Status:
已关闭
Priority:
紧急
Assignee:
Target version:
IT: Easytryck (Sweden) - v4.0
Start date:
01/12/2026
Due date:
12/31/2026
% Done:

100%

Estimated time:
100.00 h

Description

Background
  1. OTS4.0屡次系统奔溃
具体问题
  • 1. PHP GD库save
    问题:OOM
    原因:可能GD库函数,exif_read_data等,读取大文件,也会导致内存枯竭。
    处置:正确使用库函数,并保证图片文件不要太大。
    备注:由于第一时间没有完全彻底调查原因,可能遗漏了部分【可能性】。
  • 2. PHP Upload Files
    问题:OOM
    原因:AWS Liuux 2023默认tmpfs(内存文件系统),上传文件过大,导致内存枯竭(默认配置内存不足)。
    处置:自定义默认上传文件物理路劲(比如:/var/www/html/storage/upload/tmp),避免使用tmpfs。
    备注:AWS 从 Amazon Linux 2023 开始 /tmp 默认是挂载为 tmpfs(内存文件系统)。相比之前的 Amazon Linux 2 和更早版本,AL2023 是第一个默认把 /tmp 放到 tmpfs 上的 AWS Linux 版本。
  • 3. PHP CSV下载
    问题:OOM
    原因:程序读取数据表全量数据放入php变量,在加之在使用一些php函数比如array_merge时,导致内存撑爆
    处置:分割读取: 一边读取一边写入数据到CSV文件,限制读取内容,避免使用数组存储大数据进行数据的copy或者合并等操作。
    备注:后续其他导入/导出/脚本批处理等操作时,应该使用分割读取保证固定内存
共通措施
  • 1. DONE (small 2GB->medium 4GB) : Memorty使用Usage:ps aux --sort=-%mem | head
    如果2GB的内存,mysql等占用内存偏高(%31.5, 600-700MB),我们可能需要【措施:降低内存消耗比例】。
    - 比如限制使用【Select *】。
    - 其他:比如添加监测
           ots4.0整体Mysql内存消耗(基本都在35%以上)都过大(SBX都没有这么高的比例:基本都在1%)。
           能否在DB class的query函数内,统一添加查询结果的字节数(内存变量) > 10MB, error.log提示监测呢?
    
           参考代码:仅仅参考,注意SQL结果可能null
    
           /** ================== 内存监测 BEGIN ================== */
            $bytes = strlen(serialize($result->rows));
            $limit = 10 * 1024 * 1024; // 10MB
    
            if ($bytes > $limit) {
                error_log(
                    '[DB QUERY LARGE RESULT] ' .
                    'Size: ' . round($bytes / 1024 / 1024, 2) . 'MB | ' .
                    'Rows: ' . $result->num_rows . ' | ' .
                    'SQL: ' . $sql
                );
            }
           /** ================== 内存监测 END ================== */
           
  • 2. DONE (SWAP内存 2G):提高EC2配置 或者 添加 SWAP,防止 OOM Kill。
v4 coding standard:
  1. Git提交
    #xxx(redmine number): xxx(redmine title) - xxx(任意:补充内容)
      
  2. 代码规范
    2.1: 结构:Public -> Protected -> Private
    2.2: 其他代码规范同SBX
      
  3. MVCL的v3/v4物理分割
    3.1: v3/v4的代码分为两个文件,比如: order.php, order_v3.php
    3.2: system也分为两个文件,暂时只有一个user_v3
    - Note: front的$this->user在v4中会替换为$this->customer, 即v4中需要清除$this->user
    3.3: 代码中,区分v3/v4的调用,比如:new User_V3
     
  4. 前台代码
    twig, js, css (js, css尽量写在单独的css文件中)
     
  5. 后台代码
    MVCL (L:en,cn)
     
  6. 注释
    1. 类名:
      /**
       * xxx
       *
       * @copyright RedBlue-OTS 2024
       * @version v4
       *
       */
      
    2. 函数名:参数类型 + 返回值类型
          /**
           * xxx
           *
           * @param  xxx $xxx
           * @param  xxx $xxx
           * @return xxx
           */
      
Output
  • Report and Solution

Others

Actions

Also available in: PDF Atom