[转帖] 在Linux上查看活跃线程数与连接数
https://www.cnblogs.com/codelogs/p/17178675.html
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明。
简介#
现如今,有两种常见的软件资源几乎成了Java后端程序的标配,即线程池与连接池,但这些池化资源非常的重要,一旦不够用了,就会导致程序阻塞、性能低下,所以有时我们需要看看它们的使用情况,以判断这里是否是瓶颈。
查看活跃线程数#
在Linux上,通过top -H -p 1命令,可以查看java进程的线程情况,其中1是java进程号,如下:
如上,可以看到线程的名称、CPU使用率等,其中http-nio-8080-e就是Tomcat线程池中的线程,tomcat线程全名类似于http-nio-8080-exec-20,由于Linux中线程名称有长度限制,所以被截断了。
注:jdk8的话,需要jdk8u222以上版本,才能在top中看到线程名称。
我们数一下http-nio-8080-e线程的数量,发现它有20个,正好对应上了在springboot中的线程配置。
这样能通过top得到线程池的线程数量了,但如何了解线程池的使用情况,即活跃线程有多少个呢?
经过查看man文档,我发现top命令有一个-i选项,描述如下:
意思就是i是一个开关选项,默认会显示全部线程,而打开此选项之后,就只显示活跃线程了!
所以,只需要利用-i选项,再配合sed/awk/uniq等文本处理命令,即可以统计出活跃线程数了,如下:
$ top -H -i -b -d 1 -n2 -p 1 | awk -v RS= 'END{print $0}' | awk '$1 ~ /[0-9]+/{print $12}' | sed -E 's/[0-9]+/n/g' | sort | uniq -c

可以看到,20个线程的线程池中,在1秒内只有4个线程是活跃的,线程池中线程数量是足够的。
这个命令脚本就不展开解释了,也不复杂,有linux命令基础的将命令依次拆开执行,应该能Get到脚本逻辑,没学过linux命令的话,就直接拿去用吧
查看活跃连接数#
在Linux上,使用ss -natp|grep pid=1可以查看1号进程的TCP连接,如下:
比如若redis数据库端口是6379的话,那么可这样查看redis连接池中连接数量,如下:
$ ss -natp | grep pid=1 | awk '$5~/:6379$/' | wc -l
20
可见当前有20个redis网络连接,那同样的,其中有多少个是活跃的呢?
经过查看man文档,发现ss中也有一个-i选项,如下:
可以发现,添加-i选项后,ss会输出tcp连接中的一些额外信息,其中lastsnd表示最后一次发送包到当前所经历的毫秒数,lastrcv表示最后一次接收包到当前所经历的毫秒数。
有了这个信息后,就可以通过awk过滤出lastsnd或lastrcv小于1000的tcp连接,这些连接即是1秒内活跃过的连接了,因此我又编写了如下命令脚本。
$ ss -natpi | sed '1!{N;s/\n//;}' | grep pid=1 | awk -v t=1000 'match($0,/lastsnd:(\w+) lastrcv:(\w+)/,a) && (a[1]<t || a[2]<t) && match($4,/(.+):(\w+)$/,s) && match($5,/(.+):(\w+)$/,d) && s[2]>=32768{print d[2]}' |sort |uniq -c |sort -nk2
8 80
3 3306
7 3307
6 6379
1 7916
如上,可以看到各连出端口的活跃连接情况,其中80是http连接池端口,3306与3307是MySQL主从库的连接池端口,6379是redis连接池的端口。
这是java应用主动连出连接的活跃情况,那调用方连入java应用的呢?
其实只需要稍微调整一下awk脚本即可,如下:
- 将
s[2]>=32768调整为s[2]<32768,其中32768是Linux默认的临时端口号的分界线,可通过sysctl net.ipv4.ip_local_port_range查询,本地端口号大于这个值,代表是连出连接. - 将
print d[2]调整为print s[2],和上面条件联合起来,输出的就是本地监听端口了.
调整后,效果如下:
$ ss -natpi | sed '1!{N;s/\n//;}' | grep pid=1 | awk -v t=1000 'match($0,/lastsnd:(\w+) lastrcv:(\w+)/,a) && (a[1]<t || a[2]<t) && match($4,/(.+):(\w+)$/,s) && match($5,/(.+):(\w+)$/,d) && s[2]<32768{print s[2]}' |sort |uniq -c |sort -nk2
8 8080
可以发现,我们服务的8080端口,1秒内活跃过的连接数是8个。
注:只有当调用方也使用连接池时,这种方法获取到的活跃连接数才是准确的,若调用方使用短链接的话,则不准确。
arthas查看活跃线程数与连接数#
通过上面的方法,已经可以查看活跃线程数与连接数了,但有些情况下,会丧失一些细节,如下:
- top中的线程名会截断,如果不同线程池的线程名前16字符一样,则在top中无法区分。
- ss中是通过端口来区分线程池的,但http服务的端口号基本都是80或443,所以不同域名的http服务的连接池无法区分。
若需要分辩这些细节,还是要深入到jvm里面来,而arthas就是一个不错的工具,它的vmtool命令能够获取指定类型的Java对象,并从Java对象中获取信息。
以springboot为例,获取内置tomcat线程池的活跃情况,如下:
# --action getInstances:表示获取对象实例
# --classLoaderClass:指定类加载器
# --className:指定要获取哪个类的实例
# --express:指定ognl表达式,用来从对象上获取信息
[arthas@1]$ vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --className org.apache.tomcat.util.threads.ThreadPoolExecutor --express 'instances.{ #{"ActiveCount":getActiveCount(),"LargestPoolSize":getLargestPoolSize(),"CorePoolSize":getCorePoolSize(),"MaximumPoolSize":getMaximumPoolSize(),"QueueSize":getQueue().size(),"ThreadName":getThreadFactory().namePrefix }}' -x 2

上面其实就是通过vmtool工具,获取到了tomcat的线程池对象,然后调用线程池的getActiveCount()等方法,获取到了活跃线程数
要获取连接池的活跃情况,也一并呈上吧,如下:
# 获取druid连接池的使用情况
[arthas@1]$ vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --className com.alibaba.druid.pool.DruidDataSource --express 'instances.{ #{"url":#this.getUrl().split("\\?")[0], "username":#this.getUsername(),"PoolingCount":#this.getPoolingCount(),"ActiveCount":#this.getActiveCount(),"MaxActive":#this.getMaxActive(),"WaitThreadCount":#this.getWaitThreadCount(),"MaxWaitThreadCount":#this.getMaxWaitThreadCount()} }' -x 2
# 获取httpclient连接池的使用情况
[arthas@1]$ vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --className org.apache.http.impl.conn.PoolingHttpClientConnectionManager --express 'instances.{ #pool=#this.pool.routeToPool.values() }' -x2
可以看到,arthas真的很方便实用,对于Java Boy来说,值得好好研究研究
作者:打码日记
出处:https://www.cnblogs.com/codelogs/p/17178675.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
[转帖] 在Linux上查看活跃线程数与连接数的更多相关文章
- linux上查看swf文件.靠谱
在linux上查看swf文件,本来想用gnash 来看,可是有的电脑上看的时候只有声音,没有图像 所以用网页来查看,推荐谷歌 我们在和flash文件的同目录下新建一个文件名为:index.html 注 ...
- dubbo监控活跃线程数
telnet对应dubbo服务的ip+端口号 status -l 其中的active就是当前的活跃线程数 通过程序定时探测写入DB,再查询渲染出来就好了 监控报警,如果已经有监控平台,可以通过一定的规 ...
- linux上限制用户进程数、cpu占用率、内存使用率
限制进程CPU占用率的问题,给出了一个shell脚本代码如下: renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > ...
- tomcat高并发优化的参数优化并查看tomcat线程数
在Tomcat配置文件conf下面 server.xml 中的配置中和连接数相关的参数有: minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10 maxProcessor ...
- 【转帖】Linux上,最常用的一批命令解析(10年精选)
Linux上,最常用的一批命令解析(10年精选) https://juejin.im/post/5d134fbfe51d4510727c80d1 写的挺好呢 Linux这么多命令,通常会让初学者望而生 ...
- 【转帖】Linux上搭建Samba,实现windows与Linux文件数据同步
Linux上搭建Samba,实现windows与Linux文件数据同步 2018年06月09日 :: m_nanle_xiaobudiu 阅读数 15812更多 分类专栏: Linux Samba 版 ...
- Linux 系统开启最大线程数 调优
系统最大线程数说明 系统可开启的最大线程数,可根据系统本身负载配置进行调优. 查看系统最大线程数 1.查看系统开启的最大线程数. ulimit -u [root@izbp1brwu1w35r1dmj8 ...
- 修改linux系统用户最大线程数限制
linux系统对线程数量有个最大限制,当达到系统限制的最大线程数时使用账号密码ssh到系统时是无法登陆的,会报Write failed: Broken pipe,或者是shell request fa ...
- linux修改用户最大线程数
linux下普通用户最大允许使用线程数为1024: 但是并发量大时,该1024配置项远远不够满足我们的需要,我们可以修改/etc/security/limits.d/90-nproc.conf配置设置 ...
- Linux 看进程的线程数
pstree -p 12345|wc -l 看进程的线程数 centos7默认并没有安装pstree,所以会有pstree:command not found 安装一下 yum install psm ...
随机推荐
- MySQL进阶篇:详解MySQL存储引擎选择
MySQL进阶篇:第一章_一.五_MySQL存储引擎选择 在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎.对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合. InnoDB: ...
- 听6位专家畅谈AI大模型落地实践:场景和人才是关键
本文分享自华为云社区<听6位专家畅谈AI大模型落地实践:场景和人才是关键>,作者:华为云社区精选. 随着人工智能技术的不断突破,越来越多的行业开始应用AI技术来提高效率.降低成本.改善用户 ...
- 618狂欢结束,来聊聊华为云GaussDB NoSQL的蓬勃张力
又到了一年一度的 618大促的时候,随着近十年网上购物的兴起,各大平台在不同的时期推出各种购物促销活动,极大的促进了消费,刺激了市场.同样,在科技领域,为了支撑突然而来的高并发,支持千万人同时在线浏览 ...
- 云图说丨初识华为云OrgID:轻松实现统一帐号、统一授权
本文分享自华为云社区<[云图说]第282期 初识华为云OrgID:轻松实现统一帐号.统一授权>,作者: 阅识风云 . 组织成员帐号 OrgID是面向企业提供组织管理.企业成员帐号管理以及S ...
- 探索开源工作流引擎Azkaban在MRS中的实践
摘要:本文主要介绍如何在华为云上从0-1搭建azkaban并指导用户如何提交作业至MRS. 本文分享自华为云社区<开源工作流引擎Azkaban在MRS中的实践>,作者:啊喔YeYe. 环境 ...
- 一文讲述数仓组件SysCache
摘要:SysCache是ThreadLocal结构,每个线程都具有各自的SysCache,其中存储的缓存信息由执行的业务决定. 本文分享自华为云社区<GaussDB(DWS)CBB组件之SysC ...
- DarkMode(2):深色模式解决方案——css颜色变量实现Dark Mode
暗黑模式实现,最初的设计,就是参考之前的主题模式.所谓多套主题/配色/皮肤,就是我们很常见的换肤功能.换肤简单的实现就是更换 css实现不同样式呈现不同肤色. 之前做不同颜色的皮肤,暗黑模式可以单做其 ...
- 处理开发者账号到期导致APP下架的方处理开发者账号到期导致APP下架的方法
开发人员账号到期时,应采取以下步骤处理APP被下架问题: 登录开发者账号. 点击右上角的"账户",选择"续费". 输入信用卡信息,确保使用支持Visa的银行 ...
- 还在用 Excel 和 SQL?火山引擎 VeDI 这款产品帮你更快处理数据
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 对大多数职场打工人来说,看数据.用数据一直是项有"门槛"的工作. 特别是在企业业务快速发展的背景下,为 ...
- 火山引擎 DataTester:构建增长闭环,3-5 人即可搭建企业增长团队
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 增长是一个老生常谈的话题,对许多企业而言这个词都很熟悉,但在实践过程中仍然有很多的疑问,比如指标体系应该怎么搭建? ...