[文章导读]win10更新遇到错误代码0x803c0103怎么辦?有时候在电脑更新程序的时候突然会出现0x803c0103错误代码那么怎么解决,为此系统屋为你带来一个详细的win10更新遇到错误代码0x803c0103解决方法在这裏你可以轻松的通过该方法解决所遇到的问题。
win10更新遇到错误代码0x803c0103怎么办?有时候在电脑更新程序的时候突然会出现0x803c0103错误代码那么怎么解決,为此系统屋为你带来一个详细的win10更新遇到错误代码0x803c0103解决方法在这里你可以轻松的通过该方法解决所遇到的问题。
2、在服务界面查看鉯下几个服务是否正常开启:
若您使用Windows Update出现问题您可以尝试以下步骤:
4.再次尝试升级更新。
以上就是小编为大家整理的win10更新遇到错误代碼0x803c0103怎么办、win10更新遇到错误代码0x803c0103解决方法想了解更多电脑系统使用相关内容,可以对电脑系统城进行关注!
简介:有哪些常见的线上故障洳何快速定位问题?本文详细总结工作中的经验从服务器、Java应用、数据库、Redis、网络和业务六个层面分享线上故障排查的思路和技巧。较長同学们可收藏后再看。
线上定位问题时主要靠监控和日志。一旦超出监控的范围则排查思路很重要,按照流程化的思路来定位问題能够让我们在定位问题时从容、淡定,快速的定位到线上的问题
内存dump文件比较大,有1.4G先压缩,然后拉取到本地用7ZIP解压
2.2.4 分析内存赽照文件
使用Memory Analyzer解析dump文件,发现有很明显的内存泄漏提示
(4)新生代使用的GC算法
(5)老年代使用的GC算法
(a)监控内存的OOM场景
不要在线上使用jmap手动抓取内存快照其一系统OOM时手工触发巳经来不及,另外在生成dump文件时会占用系统内存资源导致系统崩溃。只需要在JVM启动参数中提取设置如下参数一旦OOM触发会自动生成对应嘚文件,用MAT分析即可
# 内存OOM时,自动生成dump文件
如果Young GC比较频繁5S内有打印一条,或者有Old GC的打印代表内存设置过小或者有内存泄漏,此时需偠抓取内存快照进行分享
一般情况下会有监控告警进行提示:
利用top查到占用cpu最高的进程pid为14,结果图如下:
2.2.4 查询线程详细信息
由上一步可知该问题是由 CpuThread.java 类引发的故查询项目代码,获得如下信息:
根据代码和日志分析可知是由于限制值max太大,致使线程长时间循环执行从洏导致问题出现。
最近线上随着流量变大突然开始报如下异常,即发生了死锁问题:
3.1.2.2 查询数据库死锁日志
由上可知是由于两个事物对這条记录同时持有S锁(共享锁)的情况下,再次尝试获取该条记录的X锁(排它锁)从而导致互相等待引发死锁。
根据死锁日志的SQL语句定位获取箌如下伪代码逻辑:
分析获得产生问题的加锁时序如下,然后修改代码实现以解决该问题
应用TPS下降,并出现SQL执行超时异常或者出现了类姒如下的告警信息则常常意味着出现了慢SQL。
分析执行计划:利用explain指令获得该SQL语句的执行计划根据该执行计划,可能有两种场景
SQL不走索引或扫描行数过多等致使执行时长过长。
SQL没问题只是因为事务并发导致等待锁,致使执行时长过长
通过增加索引,调整SQL语句的方式優化执行时长 例如下的执行计划:
该SQL的执行计划的type为ALL,同时根据以下type语义可知无索引的全表查询,故可为其检索列增加索引进而解决
可以通过查看如下3张表做相应的处理:
-- 农村当前存在的问题运行的所有事务
-- 锁等待的对应关系
(1)查看农村当前存在的问题的事务有哪些:
根据事务情况,得到表信息和相关的事务时序信息:
A事物锁住一条记录,不提交B事物需要哽新此条记录,此时会阻塞如下图是执行顺序:
由前一步的结果,分析事务间加锁时序,例如可以通过tx_query字段得知被阻塞的事务SQL,trx_state得知事务状態等找到对应代码逻辑,进行优化修改
trx_mysql_thread_id是对应的事务sessionId,可以通过以下命令杀死长时间执行的事务从而避免阻塞其他事务执行。
先利鼡show processlist获取连接信息然后利用kill杀死过多的连。
主键索引(聚集索引):
InnoDB存储引擎中页的大小為16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节)指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K個键值(因为是估值为方便计算,这里的K取值为[10]^3)
3.4.3 倳物的隔离级别3.4.3.1 如何查看数据库的事务隔离级别
使用如下命令可以查看事务的隔离级别:
MVCC最大的好处相信也是耳熟能详:读不加锁,读写不冲突在读多写少的OLTP应用中,读写不冲突是非常重要的极大的增加了系统的并发性能。
快照读:简单的select操作属于快照读,不加锁(当然,也有例外下面会分析)。
农村当前存在的问题读:特殊的读操作插入/更新/删除操作,属于农村当前存在的问题读需要加锁。
修改事务隔离级别的语句:
不可重复读的重点是修改: 同样的条件, 你讀取过的数据, 再次读取出来发现值不一样了
表结构与数据如下:id不是主键,也不是唯一索引只是一个普通索引,事务隔离级别设置的昰RR可以模拟到GAP锁产生的场景。
在标准的事務隔离级别定义下REPEATABLE READ是不能防止幻读产生的。INNODB使用了2种技术手段(MVCC AND GAP LOCK)实现了防止幻读的发生
Innodb引擎又支持行锁,行锁分为共享锁一个事务对一行的共享只读锁。排它鎖一个事务对一行的排他读写锁。
这两中类型的锁共存的问题考虑这个例子:
事务A锁住了表中的一行让这一行只能读,不能写之后,事务B申请整个表的写锁如果事务B申请成功,那么理论上它就能修改表中的任意一行这与A持有的行锁是冲突的。
数据库需要避免这种沖突就是说要让B的申请被阻塞,直到A释放了行锁
数据库要怎么判断这个冲突呢?
step1:判断表是否已被其他事务用表锁锁表
step2:判断表中的烸一行是否已被行锁锁住
在无意向鎖的情况下,step2需要遍历整个表,才能确认是否能拿到表锁而在意向锁存在的情况下,事务A必须先申请表的意向共享锁成功后再申请一行嘚行锁,不需要再遍历整个表提升了效率。因此意向锁主要是为了实现多粒度锁机制(白话:为了表锁和行锁都能用)
-- select操作均不加锁,采用的是快照读因此在下面的讨论中就忽略了
组合分为如下几种场景:
(1)组合7的GAP锁详解读
Insert操作,如insert [10,aa]首先会定位到[6,c]与[10,b]间,然后在插叺前会检查这个GAP是否已经被锁上,如果被锁上则Insert不能插入记录。因此通过第一遍的农村当前存在的问题读,不仅将满足条件的记录鎖上
(X锁)与组合三类似。同时还是增加3把GAP锁将可能插入满足条件记录的3个GAP给锁上,保证后续的Insert不能插入新的id=10的记录也就杜绝了同一事務的第二次农村当前存在的问题读,出现幻象的情况
既然防止幻读,需要靠GAP锁的保护为什么组合五、组合六,也是RR隔离级别却不需偠加GAP锁呢?
GAP锁的目的是为了防止同一事务的两次农村当前存在的问题读,出现幻读的情况而组合五,id是主键;组合六id是unique键,都能够保证唯一性
一个等值查询,最多只能返回一条记录而且新的相同取值的记录,一定不会在新插入进来因此也就避免了GAP锁的使用。
3.4.5 线上问题处理3.4.5.1 观察问題的几个常见库表
首先可以通过下属两个命令来查看mysql的相应的系统变量和状态变量
# status代表农村当前存在的问题系统的运行状态,只能查看不能修改
MySQL 5.7.6开始后改成了从如下表获取:
比较常用的系统变量和状态变量有:
# 查询慢SQL查询是否开启
# 查询慢SQL的时间
#设置SQL自动提交模式 1:默认,自動提交 0:需要手动触发commit,否则不会生效
# 查看默认的搜索引擎
MySQL 表关联的算法是Nest Loop Join(嵌套循环连接),是通过驱动表的结果集作为循环基础数据然后一條一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果
同上,需要100多万次扫描才能返回结果
3.5.2 使用自增长主鍵
结合B+Tree的特点自增主键是连续的,在插入过程中尽量减少页分裂即使要进行页分裂,也只会分裂很少一部分并且能减少数据的移动,每次插入都是插入到最后总之就是减少分裂和移动的频率。
时常会出现下述异常提示信息:
4.2.1 设置合理的内存大小
设置maxmemory和相对应的回收筞略算法设置最好为物理内存的3/4,或者比例更小因为redis复制数据等其他服务时,也是需要缓存的以防缓存数据过大致使redis崩溃,造成系統出错不可用
4.2.2 设置合理的内存淘汰策略
(1)有工具的情况下:
分析rdb文件中的全部key/某种类型的占用量:
查看某个key的内存占用量:
(2)无工具嘚情况下可利用以下指令评估key大小:
4.3.1 设置Redis的慢命令的时间阈值(单位:微妙)
# 配置查询时间超过1毫秒的, 第一个参数单位是微秒
# 保存200条慢查记录
(1)通过redis.conf 配置文件指定最大连接数
4.5 线上Redis节点挂掉一个之后的处理流程
(1)一开始执行如下的删除操作失败需要針对于每一个节点都执行 cluster forget:
(2)删除挂掉的节点:
(3)清理掉节点配置目录下的rdb aof nodes.conf 等文件,否则节点的启动会有如下异常:
(1)后台启动Redis某個节点:
(2)将该节点添加进集群:
s3:本次待添加的从节点ip:port
在非压测或者高峰期的情况下突然出现大量的503等错误码,页面无法打开
当Server仩有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了使用如下命令可以让之现行。
首先利用以下查看tcp总连接数判断连接数昰否正常:
然后利用如下命令判断各个状态的连接数是否正常:
根据上述信息,如果TIME_WAIT 状态数量过多可利用如下命令查看连接CLOSE_WAIT最多的IP地址,再结合业务分析问题:
TCP三次握手四次挥手
为什么在第3步中客户端还要再进行一次确认呢这主要是为了防止已经失效的连接请求报文段突然又传回到服务端而产生错误的场景:
所谓"已失效的连接请求报文段"是这样产生的。正常来说客户端发出连接请求,但因为连接请求報文丢失而未收到确认于是客户端再次发出一次连接请求,后来收到了确认建立了连接。数据传输完毕后释放了连接,客户端一共發送了两个连接请求报文段其中第一个丢失,第二个到达了服务端没有"已失效的连接请求报文段"。
现在假定一种异常情况即客户端發出的第一个连接请求报文段并没有丢失,只是在某些网络节点长时间滞留了以至于延误到连接释放以后的某个时间点才到达服务端。夲来这个连接请求已经失效了但是服务端收到此失效的连接请求报文段后,就误认为这是客户端又发出了一次新的连接请求于是服务端又向客户端发出请求报文段,同意建立连接假定不采用三次握手,那么只要服务端发出确认连接就建立了。
由于现在客户端并没有發出连接建立的请求因此不会理会服务端的确认,也不会向服务端发送数据但是服务端却以为新的传输连接已经建立了,并一直等待愙户端发来数据这样服务端的许多资源就这样白白浪费了。
采用三次握手的办法可以防止上述现象的发生比如在上述的场景下,客户端不向服务端的发出确认请求服务端由于收不到确认,就知道客户端并没有要求建立连接
SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非瑺简单即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了使用如下命令可以让之现行:
(1)为什么TCP连接的建立只需偠三次握手而TCP连接的释放需要四次握手呢?
因为服务端在LISTEN状态下,收到建立请求的SYN报文后把ACK和SYN放在一个报文里发送给客户端。而连接关闭時当收到对方的FIN报文时,仅仅表示对方没有需要发送的数据了但是还能接收数据,己方未必数据已经全部发送给对方了所以己方可鉯立即关闭,也可以将应该发送的数据全部发送完毕后再发送FIN报文给客户端来表示同意现在关闭连接
从这个角度而言,服务端的ACK和FIN一般嘟会分开发送
(2)如果已经建立了连接,但是客户端突然出现故障了怎么办
TCP还设有一个保活计时器,显然客户端如果出现故障,服務器不能一直等下去白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器时间通常是设置为2小时,若两小时还沒有收到客户端的任何数据服务器就会发送一个探测报文段,以后每隔75秒钟发送一次若一连发送10个探测报文仍然没反应,服务器就认為客户端出了故障接着就关闭连接。
(3)为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态
虽然按道理,四个报文都发送完毕我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文
在Client发送絀最后的ACK回复,但该ACK可能丢失Server如果没有收到ACK,将不断重复发送FIN片段所以Client不能立即关闭,它必须确认Server接收到了该ACKClient会在发送出ACK之后进入箌TIME_WAIT状态。Client会设置一个计时器等待2MSL的时间。如果在该时间内再次收到FIN那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum
MSL指一个片段在网络中最大嘚存活时间2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSLClient都没有再次收到FIN,那么Client推断ACK已经被成功接收则结束TCP连接。
主要是通過业务日志监控主动报警或者是查看错误日志被动发现:
6.2.2 在日志文件中检索异常
利用如下命令可获得异常的详细信息:
然后根据上述流程ㄖ志找到对应的代码实现然后进行具体的业务分析。
版权声明:本文内容由阿里云实名注册用户自发贡献版权归原作者所有,阿里云開发者社区不拥有其著作权亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产權保护指引》如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报一经查实,本社区将立刻删除涉嫌侵权内容