Project

General

Profile

追加功能 #503

Updated by Xihua Fan about 2 months ago

*Background* 
 # 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 *】。 
      - 其他:比如添加监测 
        <pre> 
        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 ================== */ 
        </pre> 

 * 2. *DONE (SWAP内存 2G)*:提高EC2配置 *其他措施*:提高EC2配置 或者 添加 SWAP,防止 OOM Kill。 

 *v4 coding standard:* 
 # Git提交 
   #xxx(redmine number): xxx(redmine title) - xxx(任意:补充内容) 
    
 # 代码规范 
  2.1: 结构:Public -> Protected -> Private 
  2.2: 其他代码规范同SBX 
    
 # 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 
   
 # 前台代码 
   twig, js, css (js, css尽量写在单独的css文件中) 
     
 # 后台代码 
   MVCL    (L:en,cn) 
     
 # 注释 
 ## 类名: 
 <pre> 
 /** 
  * xxx 
  * 
  * @copyright RedBlue-OTS 2024 
  * @version v4 
  * 
  */ 
 </pre> 
 ## 函数名:参数类型 + 返回值类型 
 <pre> 
     /** 
      * xxx 
      * 
      * @param    xxx $xxx 
      * @param    xxx $xxx 
      * @return xxx 
      */ 
 </pre> 

 *Output* 
 * Report and Solution 

 *Others*

Back