CPU突然飙升,如何排查
1.监控cpu运行状态,显示进程运行信息列表
top -c
2. 按CPU使用率排序,键入大写的P
P
3.用 top -Hp 命令查看占用 CPU 最高的线程
上一步用 top
命令找到了那个 Java 进程。那一个进程中有那么多线程,不可能所有线程都一直占着 CPU 不放,这一步要做的就是揪出这个罪魁祸首,当然有可能不止一个。
执行top -Hp pid
命令,pid 就是前面的 Java 进程,我这个例子中就是 16738
,完整命令为:
top -Hp 16738
,然后键入P (大写p),线程按照CPU使用率排序
4.查看堆栈信息,定位对应代码
通过printf命令将其转化成16进制,之所以需要转化为16进制,是因为堆栈里,线程id是用16进制表示的
假如得到16进制的线程ID为4174。
通过jstack命令查看堆栈信息
jstack 16738 | grep '0x4174' -C10 --color
什么情况下会使用索引,什么时候不用?
1.主键自动建立唯一索引;
2.频繁作为查询条件的字段应该创建索引;
3.查询中与其他表有关联的字段,例如外键关系;
4.频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件;
5.where条件里用不到的字段,不创建索引;
6.高并发的情况下一般选择复合索引;
7.查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找);
8.查询中统计或者分组的字段;
9.表记录太少,不需要创建索引;
10.经常增删改的表;
11.数据重复且分布平均的字段,因此为经常查询的和经常排序的字段建立索引。注意某些数据包含大量重复数据,因此他建立索引就没有太大的效果,例如性别字段,只有男女,不适合建立索引。
索引的优缺点
索引的优点:
① 建立索引的列可以保证行的唯一性,生成唯一的rowId
② 建立索引可以有效缩短数据的检索时间
③ 建立索引可以加快表与表之间的连接
④ 为用来排序或者是分组的字段添加索引可以加快分组和排序顺序
索引的缺点:
① 创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大
② 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)
③ 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长
线程加锁会造成什么问题?
加锁通常会严重地影响性能。线程会因为竞争不到锁而被挂起,等锁被释放的时候,线程又会被恢复,这个过程中存在着很大的开销,并且通常会有较长时间的中断,因为当一个线程正在等待锁时,它不能做任何其他事情。