记一次项目网站访问慢问题排查处理

问题排查

1 服务器信息查看

top命令使用

使用top命令进行服务器相关信息查看,查看是内存不够、CPU处理能力不够、IO读写过高….等。

在这里插入图片描述

服务器为多核,因此需要按下按键“1”查看全部CPU具体信息。

在这里插入图片描述

显示信息详解

top命令第一行
top - 11:01:20 up 486 days, 19:31,  1 user,  load average: 0.21, 0.28, 0.30

依次对应:系统当前时间 up 系统到目前为止i运行的时间, 当前登陆系统的用户数量, load average后面的三个数字分别表示距离现在一分钟,五分钟,十五分钟的负载情况。
这行信息与命令uptime显示的信息相同
注意:load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

top命令第二行–进程状态
Tasks: 183 total,   1 running, 182 sleeping,   0 stopped,   0 zombie

依次对应:tasks表示任务(进程),183 total则表示现在有183个进程,其中处于运行中的有1个,182个在休眠(挂起),stopped状态即停止的进程数为0,zombie状态即僵尸的进程数为0个。

top命令第三行–CPU状态
%Cpu(s):  0.6 us,  0.2 sy,  0.0 ni, 95.0 id,  0.0 wa,  0.0 hi,  0.0 si,  4.1 st

依次对应:
us:user 用户空间占用cpu的百分比
sy:system 内核空间占用cpu的百分比
ni:niced 改变过优先级的进程占用cpu的百分比
空闲cpu百分比
wa:IO wait IO等待占用cpu的百分比
hi:Hardware IRQ 硬中断 占用cpu的百分比
si:software 软中断 占用cpu的百分比
st:被hypervisor偷去的时间

多核服务器需要展开查看具体CPU状态

top命令第四行–内存状态
KiB Mem : 32753588 total,  1142352 free, 25133012 used,  6478224 buff/cache

依次对应:物理内存总量;空闲内存总量;使用中的内存总量;缓冲内存量;
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心

top命令第五行–swap交换分区
KiB Swap:  4194300 total,  2880252 free,  1314048 used.  6677308 avail Mem 

依次对应:交换区总量;空闲交换区总量;使用的交换区总量;在不交换的情况下,对启动新应用程序可用内存的估计

对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。


top命令第七行–进程监控
PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND 

依次对应:
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)

2 数据库分析

show PROCESSLIST

查看数据库进程信息,从执行及等待时间查找慢语句
在这里插入图片描述

有时info的sql语句过长无法全部显示,则需要使用下面命令


select * from information_schema.processlist;

在这里插入图片描述


show OPEN TABLES where In_use > 0;

查询是否锁表 ,使用下面命令可进行锁表进程kill


SELECT CONCAT(‘kill ‘,trx_mysql_thread_id,’;’) FROM INFORMATION_SCHEMA.INNODB_TRX;
在这里插入图片描述

反复执行该语句查看是否存在同一进程或进程过多,直接执行“kill 4147”则可杀死该进程

3 慢查询分析

开启并配置完慢查询日志后,超过配置阀值的查询时间语句会写入slow.log中。【如何开启及配置不做描述,可查阅相关资料】

使用tail命令动态阅读慢查询日志看是否存在长时间查询语句,如下。

在这里插入图片描述

若日志刷新过快可使用日志截取语句进行截取:

先进入log所在文件夹下:
sed -n "/16:40:00/,/16:53:00/p" slow.log >2021slow.log

问题解决

由于大量访问造成的数据库查询压力,排查慢查得知查询过慢语句,添加索引进行优化处理。

mysql索引相关传送门

MySQL索引的创建与使用

mysql 如何添加索引

USING BTREE 是什么意思 有什么作用 Mysql

<think>嗯,用户想解决Autosar NVM读取速度问题。首先得弄清楚NVM的读取流程是怎样的。根据引用[1],Autosar NVM负责非易失性存储的管理,比如闪存或EEPROM。读取速度可能涉及到硬件和软件两方面。 硬件方面,闪存的物理特性可能限制速度,比如页读取时间和接口带宽。EEPROM通常比闪存更,所以如果用的是EEPROM,可能需要考虑更换存储介质。不过汽车行业可能因为可靠性要求高,不能随便换,得看具体应用。 软件配置方面,用户提到的引用[3]提到NvM_ReadAll和快速模式的问题。当前参数必须设为false,说明快速模式可能不被支持。不过也许有其他配置参数可以调整,比如块管理策略。如果块分散存储,寻址时间会增加,所以优化块布局,减少碎片可能有帮助。 缓存机制也很重要。NvM提供缓存功能,如果缓存未命中,就会触发物理读取。增大缓存区或调整缓存策略,比如更智能的预取,可以减少物理读取次数。但缓存大小受限于RAM,得在资源允许的情况下调整。 多块读取优化。如果每次只读一个块,频繁的IO操作会影响速度。看看是否支持批量读取,或者并行处理多个块请求。不过Autosar的标准接口可能有限制,需要查文档确认。 任务优先级和调度策略也可能影响。如果NvM任务优先级低,可能被高优先级任务抢占,导致延迟。调整任务优先级,确保NvM操作及时执行,但要注意别影响实时任务。 底层驱动优化。检查存储驱动的访问模式,比如DMA传输是否启用,中断处理是否高效。可能需要对驱动进行调优,减少不必要的延迟。 代码层面,避免冗余读取,比如同一个块多次读取可以缓存起来。异步读取机制,让应用在数据就绪后再处理,而不是阻塞等待,也能提升效率。 原因分析的话,硬件限制是根本,软件配置不当比如缓存太小或块分散,任务调度不合理,以及驱动效率低都是可能因素。需要综合排查,可能用工具分析读取过程中的时间消耗,找到瓶颈所在。 用户可能是在实际项目中遇到了性能问题,需要具体案例的数据来分析。比如日志录各阶段的耗时,或者使用性能分析工具。优化时需要平衡速度和可靠性,确保改动不会影响数据完整性。</think>### Autosar NVM读取性能优化方法及原因分析 #### 一、性能瓶颈原因分析 1. **硬件限制** - 非易失性存储器(如闪存/EEPROM)的物理特性导致固有延迟,例如闪存的页读取时间通常为微秒级,而EEPROM的写入时间可能达到毫秒级[^1]。 - 存储介质接口带宽限制(如SPI/I2C总线速率)。 2. **软件配置问题** - NvM块管理策略不合理(如块分散存储增加寻址时间)。 - 未启用缓存机制或缓存区大小不足,导致频繁触发物理读取[^3]。 3. **任务调度影响** - NvM读取任务优先级设置过低,导致操作被高优先级任务频繁抢占。 #### 二、优化方法及实现 1. **硬件层优化** - 选择高速存储器介质(如NOR闪存替代EEPROM)。 - 优化存储器接口配置(如提升SPI时钟频率)。 2. **软件配置优化** ```c /* 示例:配置NvM块连续存储 */ const NvM_BlockDescriptorType NvM_BlockDescriptors[] = { { .NvM_BlockId = 0x01, .NvM_BlockLength = 256, .NvM_BlockStorageType = NVM_BLOCK_STORAGE_CONTIGUOUS // 连续存储 } }; ``` - 启用块缓存并调整缓存策略: $$ \text{缓存命中率} = \frac{\text{缓存命中次数}}{\text{总读取次数}} \times 100\% $$ - 通过`NvMSetBlockProtection()`关闭非关键区块的写保护,减少状态检查开销[^2]。 3. **任务调度优化** - 在OSEK/VDX配置中提升NvM任务优先级: ```c TASK(NvM_ReadTask) { PRIORITY = 4; // 原优先级为6 ... } ``` 4. **代码级优化** ```c /* 异步读取模式示例 */ Std_ReturnType NvM_ReadBlock_Async(NvM_BlockIdType BlockId, void* DataPtr) { if(NvM_GetBlockStatus(BlockId) == NVM_REQ_OK) { return NvM_ReadBlock(BlockId, DataPtr, NULL); } return E_NOT_OK; } ``` - 采用批量读取代替单块读取,减少任务切换开销。 #### 三、性能验证方法 1. 使用Trace32工具录读取操作时间分布 2. 通过内存映射分析工具检查存储布局 $$ \text{存储效率} = \frac{\text{有效数据量}}{\text{总存储空间}} \times 100\% $$
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值