es 高cpu 负载

搜索占用cpu最高的线程

1
2
3
tid=`top -Hp 2725`

top -Hp 17077

17120

查看堆栈

1
2
3
sudo -u elk-user /usr/local/java/jdk1.8.0_131/bin/jstack 2725 > /tmp/es_stack.log

jstack 23265 > /tmp/es_stack.log

拿到占用cpu最高的线程栈

1
2
printf "%x \n" ${tid}
printf "%x \n" 23307

得到 42e0, 然后打开/tmp/es_stack.log 搜索

1
2
3
4
5
6
7
8
9
10

"VM Thread" os_prio=0 tid=0x00007f745c0c8800 nid=0xad2 runnable

"Gang worker#0 (Parallel GC Threads)" os_prio=0 tid=0x00007f745c01b000 nid=0xacf runnable

"Gang worker#1 (Parallel GC Threads)" os_prio=0 tid=0x00007f745c01d000 nid=0xad0 runnable

"Concurrent Mark-Sweep GC Thread" os_prio=0 tid=0x00007f745c04a800 nid=0xad1 runnable

"VM Periodic Task Thread" os_prio=0 tid=0x00007f745c12e000 nid=0xada waiting on condition

大量GC, 看下堆内存发现太小了。 改成1G就好了

jvm.options

1
2
-Xms1024m
-Xmx1024m

参考

找到Linux虚机Load高的”元凶”

如何挂载ecs数据盘

先将数据盘挂载到实例上

分区

fdisk /dev/vdb

1
2
3
4
5
n

p

w

再格式化

mkfs.ext4 /dev/vdb1

再修改 /etc/fstab

cp /etc/fstab /etc/fstab.bak

mkdir -p /data
echo /dev/vdb1 /data ext4 defaults 0 0 >> /etc/fstab

再将分区挂载到对应的文件系统路径下

mount /dev/vdb1 /data

zset的使用

查出前 8

1
2
3
4
5
6
7
8
9
127.0.0.1:6379>  ZREVRANGE key 0 7
1) "v8"
2) "v7"
3) "v6"
4) "v5"
5) "v4"
6) "v3"
7) "v2"
8) "v1"

0 -6 等同于 0 length -6

1
2
3
4
127.0.0.1:6379> ZREVRANGE key 0 -6
1) "v8"
2) "v7"
3) "v6"

mysql查询的坑

— 以下sql 会 查询出 所有时间段内的记录

1
2
3
4
select *
from gift_trade
where pay_customer_id = 86791532 or gain_customer_id = 86791532
and create_time > '2018-04-01 00:00:00' and create_time < '2018-05-01 00:00:00'>

— 以下sql会只查询出 4月份的记录

1
2
3
4
select *
from gift_trade
where( `created_date`> '2018-04-01 00:00:00' and `created_date` < '2018-05-01 00:00:00')
and (gain_customer_id = 86791532 or pay_customer_id = 86791532 )

– join

join = inner join

and 等于 inner join

mysql join 之后是乘积

innner join 时必须字段在多个表都存在才有数

只要join的字段是唯一索引, 就不用担心重复

使用join on 为表建立别名, on 字段时要引用字段对应表的别名

– left join

以左边为准, 但是如果右边有where语句, 应该是在 join后再走的where

比如如下的只会查出所有ac.certification_status IN (0,2), 而不是所有左边的

1
2
3
DELETE FROM `reward` WHERE `customer_id` IN 
(SELECT * FROM (SELECT r.`customer_id` FROM `reward` r LEFT JOIN `action_certification` ac on r.`customer_id` =ac.`customer_id`
WHERE ac.`certification_status` IN (0,2)) a);

– 单引号的坑

单引号只能单独用在字段, 表上. 比如a.field1, 像a.field1 就是错的

– group

group 查询的非聚合函数字段一定要在group中

– 去重
distinct 去重是单列的, 如何多列去重呢, 联合 group + 聚合函数

mysql 什么时候使用索引

类型不一致不会

数据库是 varcher, java是long

排序时使用索引分页

排序值需要作为最后的索引. 如果是ID分页, ID要作为排序值放到索引最后一列; 如果是limit分页, 需要把对应的排序值放到索引最后一列