Arthas 和 mongo

49 阅读2分钟

Arthas

命令:

表达式常用变量:params 入参数组(params[0])、 returnObj返回值、 throwExp异常、 target this(实例字段:target.someField)、#cost耗时ms。末尾还能跟条件表达式,比如只要返回非空:‘returnObj’ ‘returnObj.size()>0’

平时用的比较多的是

bash
dashboard总览:线程CPU/内存/GC
thread线程列表按CPU排序
thread 看某线程堆栈;thread -b 直接找死锁
sc -d *InstanceResult搜类,谁加载的、jar路径(classloader问题查这个)
sm 类 方法搜方法存在性
trace 类 方法方法内部调用链 + 每步耗时,查“慢在哪”首选
watch 类 方法 '{params,returnObj,throwExp}' -x 2看入参,返回,异常
watch 类 方法 'returnObj' -b-b入口时看,默认返回时;-e异常时;-s成功时
stack 类 方法反向,谁调用了这个方法(不知道入口在哪时神器)
tt -t 类 方法时空隧道录现场,事后可回放
tt -l /tt -i 1000 -w 'target.params' / tt -i 1000 -r列表/查看/重放调用
jad类 --source-path / tmp反编译线上实际运行的代码(怀疑部署版本不对时用)
ognl '@java.lang.System@getProperty("user.home")'静态求值/调静态方法
vmtool --action getInstances --className 类 --express 'instances[0].field'直接从堆里抓一个现存对象看字段,watch 抓不到的"已存在的值"用它
logger --name ROOT --level debug线上临时改日志级别
profiler start / stop --format html火焰图,CPU 热点
heapdump /tmp/dump.hprof导堆给 MAT 分析
reset 类 / stop探针 / 彻底卸载

慢 → trace;

值 → watch/tt;

谁调的 → stack;

调用方未知类加载异常 → sc -d;

线上代码是不是我看的这份 → jad

mongo

常用命令

查

命令释义
db.tasks.find({tenantId: "88364"})列表
db.tasks.find({tenantId: "88364"}, , { workflowInstanceId:1, state:1, _id:0 })只要这两个字段 projection 是白名单:只要有任意一个 1,就是 include 模式,没点名的字段一律不返回(唯一例外 _id,默认给,除非 _id:0 关掉) ;反过来写 { tenantId:0 } 这种全是 0 的是 exclude 模式:除了点名的,全显示。两种模式只能选一种,除 _id 外不能混用
db.tasks.findOne({ _id: ObjectId("5ecc7deb5b03870001ce6ae4") })ObjectId是类型包装:24位十六进制是Mongo特有的ObjectId类型(前8位是时间戳; 能从5ecc7deb认出是 2020-05生成的)
db.tasks.countDocuments({tenantId: "88364"})条数
db.tasks.find({remindLogs: {$exists: true}}).sort({createTime: -1}).limit(10)最新 10条
db.tasks.distinct("tenantId")去重取值

写

命令
db.tasks.insertOne({tenantId:"xx", state: "in_progress"})
db.tasks.updateOne({{ _id: ... }, {$set: {state: "completed"}}})
db.tasks.updateMany({tenantId: "88364"}, {$set: {appId: "CRM"}})
db.tasks.deleteOne({_id: xxx})

聚合

db.tasks.aggregate([{match:{tenantId: "88364"}}, {group:{_id: "state",n: {sum: 1}}}])

索引

db.tasks.getIndexs()

常用操作符

标题