k8s 动态 PV 集成 ceph 块设备存储
Arthas 之使用 profiler 做复杂链路分析
Arthas 的 profiler 命令
命令说明
profiler
命令支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。
profiler
命令的实现依赖于开源 async-profiler
:
GitHub:https://github.com/jvm-profiling-tools/async-profiler
k8s 静态 PV 集成 ceph 块设备存储
Arthas 之查看类加载信息的相关命令
通过 Arthas 中的 trace/monitor/watch/stack/tt 等命令,可以查看方法内部调用信息,从而定位定位方法调用问题。
sc(已加载的类信息)
方法介绍
“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息。
官方文档:
https://arthas.aliyun.com/doc/sc.html
参数说明
使用 sc --help
获取 sc 命令的帮助信息:
[arthas@32344]$ sc -help
USAGE:
sc [-c <value>] [-d] [-x <value>] [-f] [-h] [-E] class-pattern
SUMMARY:
Search all the classes loaded by JVM
EXAMPLES:
sc -d org.apache.commons.lang.StringUtils
sc -d org/apache/commons/lang/StringUtils
sc -d *StringUtils
sc -d -f org.apache.commons.lang.StringUtils
sc -E org\\.apache\\.commons\\.lang\\.StringUtils
WIKI:
https://alibaba.github.io/arthas/sc
OPTIONS:
-c, --classloader <value> The hash code of the special class's classLoader
-d, --details Display the details of class
-x, --expand <value> Expand level of object (0 by default)
-f, --field Display all the member variables
-h, --help this help
-E, --regex Enable regular expression to match (wildcard matching by default)
<class-pattern> Class name pattern, use either '.' or '/' as separator
主要参数说明如下:
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 方法名表达式匹配 |
[d] | 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的 ClassLoader 等详细信息。 如果一个类被多个 ClassLoader 所加载,则会出现多次 |
[E] | 开启正则表达式匹配,默认为通配符匹配 |
[f] | 输出当前类的成员变量信息(需要配合参数 - d 一起使用) |
[x:] | 指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 toString 输出 |
[c:] |
指定 class 的 ClassLoader 的 hashcode |
[classLoaderClass:] |
指定执行表达式的 ClassLoader 的 class name |
[n:] |
具有详细信息的匹配类的最大数量(默认为 100) |
查看已加载的类信息
模糊搜索:
[arthas@32344]$ sc sample.*
sample.demo.ServerDemoApplication
sample.demo.ServerDemoApplication$$EnhancerBySpringCGLIB$$1a055512
sample.demo.controller.UserController
sample.demo.service.UserService
Affect(row-cnt:4) cost in 7 ms.
打印类的详细信息:
[arthas@32344]$ sc -d sample.demo.controller.UserController
class-info sample.demo.controller.UserController
code-source /C:/Codes/JavaWorkSpace/workspace48/arthas-demo/target/classes/
name sample.demo.controller.UserController
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name UserController
modifier public
annotation org.springframework.scheduling.annotation.EnableScheduling,org.springframework.web.bind.annotation.
RestController
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@73d16e93
+-sun.misc.Launcher$ExtClassLoader@2752f6e2
classLoaderHash 73d16e93
Affect(row-cnt:1) cost in 19 ms.
打印出类的 Field 信息:
[arthas@32344]$ sc -d -f sample.demo.controller.UserController
class-info sample.demo.controller.UserController
code-source /C:/Codes/JavaWorkSpace/workspace48/arthas-demo/target/classes/
name sample.demo.controller.UserController
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name UserController
modifier public
annotation org.springframework.scheduling.annotation.EnableScheduling,org.springframework.web.bind.annotation.
RestController
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@73d16e93
+-sun.misc.Launcher$ExtClassLoader@2752f6e2
classLoaderHash 73d16e93
fields name log
type org.slf4j.Logger
modifier final,private,static
value Logger[sample.demo.controller.UserController]
name userService
type sample.demo.service.UserService
modifier private
annotation org.springframework.beans.factory.annotation.Autowired
Affect(row-cnt:1) cost in 6 ms.
sm(已加载类的方法信息)
方法介绍
“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。
官方文档:
https://arthas.aliyun.com/doc/sm.html
参数说明
使用 sm --help
获取 thread 命令的帮助信息:
[arthas@32344]$ sm --help
USAGE:
sm [-c <value>] [-d] [-h] [-E] class-pattern [method-pattern]
SUMMARY:
Search the method of classes loaded by JVM
EXAMPLES:
sm java.lang.String
sm -d org.apache.commons.lang.StringUtils
sm -d org/apache/commons/lang/StringUtils
sm *StringUtils *
sm -Ed org\\.apache\\.commons\\.lang\.StringUtils .*
WIKI:
https://alibaba.github.io/arthas/sm
OPTIONS:
-c, --classloader <value> The hash code of the special class's classLoader
-d, --details Display the details of method
-h, --help this help
-E, --regex Enable regular expression to match (wildcard matching by default)
<class-pattern> Class name pattern, use either '.' or '/' as separator
<method-pattern> Method name pattern
主要参数说明如下:
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 方法名表达式匹配 |
[d] | 展示每个方法的详细信息 |
[E] | 开启正则表达式匹配,默认为通配符匹配 |
[c:] |
指定 class 的 ClassLoader 的 hashcode |
[classLoaderClass:] |
指定执行表达式的 ClassLoader 的 class name |
[n:] |
具有详细信息的匹配类的最大数量(默认为 100) |
查看方法信息
展示类的所有方法:
[arthas@32344]$ sm sample.demo.controller.UserController
sample.demo.controller.UserController <init>()V
sample.demo.controller.UserController getUser(Ljava/lang/Integer;)Ljava/util/HashMap;
sample.demo.controller.UserController sample()V
Affect(row-cnt:3) cost in 33 ms.
展示方法的详细信息:
[arthas@32344]$ sm -d sample.demo.controller.UserController getUser
declaring-class sample.demo.controller.UserController
method-name getUser
modifier public
annotation org.springframework.web.bind.annotation.GetMapping
parameters java.lang.Integer
return java.util.HashMap
exceptions java.lang.Exception
classLoaderHash 73d16e93
Affect(row-cnt:1) cost in 4 ms.
Ceph 块设备 rbd 相关学习
块设备相关文档
http://docs.ceph.org.cn/rbd/rbd/
rbd 命令
创建 rbd
$ rbd create --size 10240 kcha/mysqldata
查看 rbd
$ rbd list kcha
mysqldata
调整块设备映像大小:
$ rbd resize --size 10240 kcha/mysqldata
Resizing image: 100% complete...done.
查看信息:
$ rbd info kcha/mysqldata
rbd image 'mysqldata':
size 10240 MB in 2560 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.b21066b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
移除 features
$ rbd feature disable kcha/mysqldata exclusive-lock, object-map, fast-diff, deep-flatten
rbd 占用
查看 rbd 实际占用:
$ rbd diff kcha/mysqldata | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }'
860.449 MB
$ rbd diff kcha/mysqldata | awk '{ SUM += $2 } END { print SUM/1024/1024/1024 " GB" }'
0.840282 GB
删除 rbd
直接删除:
$ rbd rm kcha/mysqldata
Removing image: 100% complete...done.
若 rbd 被占用,则需要先将占用加入黑名单,后再删除。
# 加入黑名单
$ ceph osd blacklist add 10.105.136.63:0/1081512968
blacklisting 10.105.136.63:0/1081512968 until 2020-09-01T10:46:28.920245+0000 (3600 sec)
# 删除
$ rbd rm kcha/mysqldata
Removing image: 100% complete...done.
# 查看黑名单
$ ceph osd blacklist ls
listed 1 entries
10.105.136.63:0/1081512968 2020-09-01T10:46:28.920245+0000
# 移除黑名单
$ ceph osd blacklist rm 10.105.136.63:0/1081512968
un-blacklisting 10.105.136.63:0/1081512968
导入导出
$ rbd export kcha/mysqldata ~/mysqldata
Exporting image: 100% complete...done.
$ rbd import ~/mysqldata mantidata/mysqldata --image-format 2
Importing image: 100% complete...done.
RBD 特性解析
特性一览表
RBD 支持的特性,及具体 BIT 值的计算如下
属性 | 功能 | BIT 码 |
---|---|---|
layering | 支持分层 | 1 |
striping | 支持条带化 v2 | 2 |
exclusive-lock | 支持独占锁 | 4 |
object-map | 支持对象映射(依赖 exclusive-lock ) | 8 |
fast-diff | 快速计算差异(依赖 object-map ) | 16 |
deep-flatten | 支持快照扁平化操作 | 32 |
journaling | 支持记录 IO 操作(依赖独占锁) | 64 |
默认属性值
ceph kraken 版本默认属性值
# ceph --show-config|grep rbd|grep featuresrbd_default_features = 61
为啥是 61?我们创建一个默认配置的 rbd 看看
# rbd create test-feature --size 64# rbd info rbd/test-featurerbd image 'test-feature': size 65536 kB in 16 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.107d238e1f29 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten flags:
1+4+8+16+32 = 61
就是说除了特性:striping 和 journaling 外都开启了。
控制属性
有三种方法来开启需要的特性
1、在创建 image 时,通过 --image-feature
来指定需要开启的特性
2、对已存在的 image 可以通过如下命令开启和关闭
rbd feature enable <pool-name>/<image-name> <feature-name>rbd feature disable <pool-name>/<image-name> <feature-name>
3、当然,每次通过 enable 和 disable 来不是很便捷,可以通过修改配置文件来解决
vim /etc/ceph/ceph.conf...rbd_default_features = 1...
具体该设为多少可以通过上面 BIT 值查表计算得出。