PHP后端开发技术学习 - 工作
type: channel
link: https://www.aibasil.cn/category/工作
description: 工作相关的文档
items: 阿里云rds数据库mysql版cpu占用100%排查问题过程
items: ERP收料通知单字段
items: 阿里云RDS数据库CPU占用100%问题分析与解决方法
items: ERP销售出库单
items: 阿里云服务器centos系统低版本硬盘扩容不生效解决办法

阿里云rds数据库mysql版cpu占用100%排查问题过程
type: item
date: 2022-04-21T23:53:00+08:00
description: 背景某天去到公司，用户反馈说系统响应很慢，甚至有些功能基本用不了，严重影响工作效率。测试同事说阿里云RDS数据库的CPU占用了100%，我打开阿里云dms的监控页面，确实如此，接着开始排查问题。问题排查过程因为前段时间遇到过代码死循环查询数据库导致了CPU占用100%的问题，所以一开始就往这个方向排查。首先通过阿里云的dms控制台执行show processlist命令查询数据库正在执行的线程如下 发现大量状态为sending data的线程，通过查询资料，这个状态的意思是读取和过滤数据，如果一个表数据量很大且没有索引的话，就容易出现sending data状态，官方解释是，线程正在读取和处理 SELECT 的行记录，发送给客户端，由于在这个状态下的操作会执行大量的磁盘访问（读），因此它通常是查询生命周期最长的状态。但具体为什么会占用大量CPU，还有待学习了解。之前的死循环会出现在一些同步erp数据到业务系统的定时任务中，因为需要同步大量的数据而使用了循环。使用上面的sql语句（info字段）搜索代码，发现只有一个定时任务的方法使用了这个语句，因此接着登录服务器查询这个定时任务，但是没有找到相应的定时任务，后来了解到原来一直没有配置，但是同事在前一天手动执行过这个定时任务，通过如下监控信息 发现从前一天下午5点09分开始数据库的CPU就开始飙升到100%了。通过ps命令找不到相关的定时任务进程正在执行，但为什么那些语句一直存在呢？然后在运维同事的帮助下，使用lsof和ll /proc/pid命令以及上面show processlist结果的端口查询到发起那个语句请求的进程是php-fpm，工作目录是tp框架的public目录，印象中tp框架的php think命令运行的模式是cli，因此导致sending data状态有可能不是定时任务导致的。因为当时没有及时排查出原因，所以采取了同事的建议将服务器重启。 重启后数据库的CPU确实降下来了，但是过了一会又升上去了。确定了不是由于定时任务导致的，接着继续排查代码中调用这个定时任务方法的地方，后来确实发现还有一个接口调用了这个方法，通过查询nginx的access.log日志，发现当时一直有IP频繁地请求着这个接口，初步认定是由于这个接口调用了这个方法导致的问题。接着和同事一起去查看这个方法的代码，但是却没有发现这个方法的问题，逻辑上产生死循环的逻辑也没有被发现。在测试环境模拟复现这个问题，发现在死循环中获取一个数据量为三万的表的同一条数据时（查询条件有加索引并命中）并不会导致CPU飙升，但是没有索引或没有命中索引的情况下，CPU就会一直飙升。 从上面排查的过程中，没有发现死循环，考虑到有些单据数据行比较多，所以模拟了短时间内循环查询并修改大量不同单据的情景，在命中索引的情况下，CPU占用不高，但是没有命中索引的情况下，CPU占用升到百分之五十多。接着看了生产环境相关的表，数据量大概是十万行，而且用于查询的entry_id字段并没有设置索引，因此同步数据时，如果数据量较大，循环插入或者更新数据时会导致数据库CPU占用持续升高。通过下面的监控图 119.23.123.173 - - [21/Apr/2022:11:10:03 +0800] "OPTIONS /abc_admin/v2/sourceOrderPhoto/getODODetail?inquire_type=2&express_no=10111194500 HTTP/1.1" 200 5 "https://cadmin.hopo.com.cn/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 Core/1.77.103.400 QQBrowser/10.9.4624.400" 119.23.123.176 - - [21/Apr/2022:11:10:07 +0800] "GET /abc_admin/v2/sourceOrderPhoto/getODODetail?inquire_type=2&express_no=10111194249 HTTP/1.1" 499 0 "https://cadmin.hopo.com.cn/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 Core/1.77.103.400 QQBrowser/10.9.4624.400" 119.23…

ERP收料通知单字段
type: item
date: 2022-03-11T14:49:00+08:00
description: 一、请求参数说明： 1.formid：业务对象表单Id，字符串类型（必录） 2.data：JSON格式数据（详情参考JSON格式数据）（必录） 2.1.NeedUpDateFields：需要更新的字段，数组类型，格式：[key1,key2,...] （非必录）注（更新单据体字段得加上单据体key） 2.2.NeedReturnFields：需返回结果的字段集合，数组类型，格式：[key,entitykey.key,...]（非必录） 注（返回单据体字段格式：entitykey.key） 2.3.IsDeleteEntry：是否删除已存在的分录，布尔类型，默认true（非必录） 2.4.SubSystemId：表单所在的子系统内码，字符串类型（非必录） 2.5.IsVerifyBaseDataField：是否验证所有的基础资料有效性，布尔类，默认false（非必录） 2.6.IsEntryBatchFill：是否批量填充分录，默认true（非必录） 2.7.ValidateFlag：是否验证标志，布尔类型，默认true（非必录） 2.8.NumberSearch：是否用编码搜索基础资料，布尔类型，默认true（非必录） 2.9.IsAutoAdjustField：是否自动调整JSON字段顺序，布尔类型，默认false（非必录） 2.10.InterationFlags：交互标志集合，字符串类型，分号分隔，格式："flag1;flag2;..."（非必录） 例如（允许负库存标识：STK_InvCheckResult） 2.11.Model：表单数据包，JSON类型（必录） 备注: 1.示例Model数据包中字段顺序不建议改变，否则可能会有相互影响，如果出现字段值被覆盖或丢失，则可以尝试把字段顺序向后调整一下。 2.示例Model数据包默认包含允许引入的字段，实际按需构建既可。 3.如需创建关联关系，可参考http://club.kingdee.com/forum.php?mod=viewthread&tid=1394265 。 二、返回结果： {"Result":{"ResponseStatus":{"ErrorCode":"","IsSuccess":"false","Errors":[{"FieldName":"","Message":"","DIndex":0}],"SuccessEntitys":[{"Id":"","Number":"","DIndex":0}],"SuccessMessages":[{"FieldName":"","Message":"","DIndex":0}],"MsgCode":""},"Id":"","Number":"","NeedReturnData":[{}]}} 三、代码示例： // 使用webapi引用组件Kingdee.BOS.WebApi.Client.dll K3CloudApiClient client = new K3CloudApiClient("https://hopo.ik3cloud.com/K3cloud/"); var loginResult = client.ValidateLogin("20170307142733","Administrator","888888",2052); var resultType = JObject.Parse(loginResult)["LoginResultType"].Value<int>(); //登录结果类型等于1，代表登录成功 if (resultType == 1) { client.Save("PUR_ReceiveBill","{"NeedUpDateFields":[],"NeedReturnFields":[],"IsDeleteEntry":"true","SubSystemId":"","IsVerifyBaseDataField":"false","IsEntryBatchFill":"true","ValidateFlag":"true","NumberSearch":"true","IsAutoAdjustField":"false","InterationFlags":"","Model":{"FID":0,"FBillTypeID":{"FNUMBER":""},"FBillNo":"","FDate":"1900-01-01","FStockOrgId":{"FNumber":""},"FReceiveDeptId":{"FNumber":""},"FStockGroupId":{"FNumber":""},"FReceiverId":{"FNumber":""},"FDemandOrgId"…

阿里云RDS数据库CPU占用100%问题分析与解决方法
type: item
date: 2022-03-01T15:07:16+08:00
description: 背景用户反馈使用BOASS、CRM、SRM系统时很卡，通过排查发现数据库CPU占用100%。原因分析通过DMS控制台，执行SHOW PROCESSLIST;命令，查看正在查询的进程，发现协同项目两条记录一直处于sending data 状态，再根据这两条语句，定位到服务器有两个定时任务一直在执行，已经超过五六个小时或者更长。然后查询代码逻辑，发现其中一个定时任务获取数据量太大以及运算的次数也很多，一直在抓取数据库数据，另外一个定时任务出现了死循环也在不断的查询数据库数据，导致CPU负载过高。解决办法1.优化算法，数据获取与计算采用增量的方式。 2.避免编写产生死循环的代码。

ERP销售出库单
type: item
date: 2022-02-24T16:24:00+08:00
description: 一、请求参数说明： 1.formid：业务对象表单Id，字符串类型（必录） 2.data：JSON格式数据（详情参考JSON格式数据）（必录） 2.1.NeedUpDateFields：需要更新的字段，数组类型，格式：[key1,key2,...] （非必录）注（更新单据体字段得加上单据体key） 2.2.NeedReturnFields：需返回结果的字段集合，数组类型，格式：[key,entitykey.key,...]（非必录） 注（返回单据体字段格式：entitykey.key） 2.3.IsDeleteEntry：是否删除已存在的分录，布尔类型，默认true（非必录） 2.4.SubSystemId：表单所在的子系统内码，字符串类型（非必录） 2.5.IsVerifyBaseDataField：是否验证所有的基础资料有效性，布尔类，默认false（非必录） 2.6.IsEntryBatchFill：是否批量填充分录，默认true（非必录） 2.7.ValidateFlag：是否验证标志，布尔类型，默认true（非必录） 2.8.NumberSearch：是否用编码搜索基础资料，布尔类型，默认true（非必录） 2.9.IsAutoAdjustField：是否自动调整JSON字段顺序，布尔类型，默认false（非必录） 2.10.InterationFlags：交互标志集合，字符串类型，分号分隔，格式："flag1;flag2;..."（非必录） 例如（允许负库存标识：STK_InvCheckResult） 2.11.Model：表单数据包，JSON类型（必录） 备注: 1.示例Model数据包中字段顺序不建议改变，否则可能会有相互影响，如果出现字段值被覆盖或丢失，则可以尝试把字段顺序向后调整一下。 2.示例Model数据包默认包含允许引入的字段，实际按需构建既可。 3.如需创建关联关系，可参考http://club.kingdee.com/forum.php?mod=viewthread&tid=1394265 。 二、返回结果： {"Result":{"ResponseStatus":{"ErrorCode":"","IsSuccess":"false","Errors":[{"FieldName":"","Message":"","DIndex":0}],"SuccessEntitys":[{"Id":"","Number":"","DIndex":0}],"SuccessMessages":[{"FieldName":"","Message":"","DIndex":0}],"MsgCode":""},"Id":"","Number":"","NeedReturnData":[{}]}} 三、代码示例： // 使用webapi引用组件Kingdee.BOS.WebApi.Client.dll K3CloudApiClient client = new K3CloudApiClient("https://hopo.ik3cloud.com/K3cloud/"); var loginResult = client.ValidateLogin("20170307142733","Administrator","888888",2052); var resultType = JObject.Parse(loginResult)["LoginResultType"].Value<int>(); //登录结果类型等于1，代表登录成功 if (resultType == 1) { client.Save("SAL_OUTSTOCK","{"NeedUpDateFields":[],"NeedReturnFields":[],"IsDeleteEntry":"true","SubSystemId":"","IsVerifyBaseDataField":"false","IsEntryBatchFill":"true","ValidateFlag":"true","NumberSearch":"true","IsAutoAdjustField":"false","InterationFlags":"","Model":{"FID":0,"FBillTypeID":{"FNUMBER":""},"FBillNo":"","FDate":"1900-01-01","FSaleOrgId":{"FNumber":""},"FCustomerID":{"FNumber":""},"FSaleDeptID":{"FNumber":""},"FHeadLocationId":{"FNumber":""},"FCorrespondOrgId":…

阿里云服务器centos系统低版本硬盘扩容不生效解决办法
type: item
date: 2022-02-22T18:53:00+08:00
description: 阿里云服务器在线扩容不生效，系统版本是centos6.10，后面通过阿里云硬盘扩容文档解决。