摘要: SpringBoot+HikariCP+Dropwizard-Metrics统计连接池使用情况 背景,HikariCP是Java目前使用最广的连接池工具类,SpringBoot默认也是用这个,现在想获取连接池使用情况。 这里假设SpringBoot已集成HikariCP 1.pom.xml加上Dro 阅读全文
posted @ 2020-10-28 15:56 冀子@ 阅读(873) 评论(0) 推荐(0)
摘要: 本文受阿里开源的Nacos启发,应用启动后从Nacos服务加载配置到应用中,想着本地开发的时候加载配置能否从本地存储中加载,这样也能加快开发效率 首先 我们来看下SpringCloud项目应用Nacos服务的 配置如下 然后在Nacos控制台加配置 经过如上之后,这样应用就能从Nacos取配置。 问 阅读全文
posted @ 2019-08-27 18:14 冀子@ 阅读(2220) 评论(0) 推荐(0)

CPU上下文

包括CPU寄存器和程序计数器(Program Counter,PC)。

CPU寄存器,是CPU内置的容量小、但速度极快的内存。

程序计数器,是用来存储CPU正在执行的指令位置、或者即将执行的下一条指令位置。

他们都是CPU在运行任何任务前,必须的软硬件依赖环境,因此也被叫做CPU上下文。

CPU 上下文切换,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。

根据任务的不同,CPU 的上下文切换就可以分为几个不同的场景,也就是进程上下文切换、线程上下文切换以及中断上下文切换。

进程上下文切换

进程上下文切换,是指从一个进程切换到另一个进程运行。
而系统调用过程中一直是同一个进程在运行

线程上下文切换

中断上下文切换

怎么查看系统的上下文切换情况

过多的上下文切换,会把 CPU 时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成了系统性能大幅下降的一个元凶。
既然上下文切换对系统性能影响那么大,你肯定迫不及待想知道,到底要怎么查看上下文切换呢?在这里,我们可以使用 vmstat 这个工具,来查询系统的上下文切换情况。

vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数。

比如,下面就是一个 vmstat 的使用示例:

# 每隔 5 秒输出 1 组数据
$ vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 7005360  91564 818900    0    0     0     0   25   33  0  0 100  0  0

我们一起来看这个结果,你可以先试着自己解读每列的含义。在这里,我重点强调下,需要特别关注的四列内容:

  • cs(context switch)是每秒上下文切换的次数。
  • in(interrupt)则是每秒中断的次数。
  • r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。
  • b(Blocked)则是处于不可中断睡眠状态的进程数。
    可以看到,这个例子中的上下文切换次数 cs 是 33 次,而系统中断次数 in 则是 25 次,而就绪队列长度 r 和不可中断状态进程数 b 都是 0。

vmstat 只给出了系统总体的上下文切换情况,要想查看每个进程的详细情况,就需要使用我们前面提到过的 pidstat 了。给它加上 -w 选项,你就可以查看每个进程上下文切换的情况了。

比如说:

# 每隔 5 秒输出 1 组数据
$ pidstat -w 5
Linux 4.15.0 (ubuntu)  09/23/18  _x86_64_  (2 CPU)

08:18:26      UID       PID   cswch/s nvcswch/s  Command
08:18:31        0         1      0.20      0.00  systemd
08:18:31        0         8      5.40      0.00  rcu_sched
...

这个结果中有两列内容是我们的重点关注对象。一个是 cswch ,表示每秒自愿上下文切换(voluntary context switches)的次数,另一个则是 nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数。

这两个概念你一定要牢牢记住,因为它们意味着不同的性能问题:

  • 所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
  • 非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
posted @ 2019-10-14 10:14 冀子@ 阅读(159) 评论(0) 推荐(0)
摘要: 下载克隆 git clone http://xxx/yyy.git git clone b branchName url 切换 cd yyy 切换分支 git checkout b develop git checkout b develop remote_branch_name egg. git 阅读全文
posted @ 2019-10-14 10:07 冀子@ 阅读(140) 评论(0) 推荐(0)
摘要: UidGenerator:readme https://github.com/lyg123/uid-generator/blob/master/README.zh_cn.md leaf readme https://tech.meituan.com/2019/03/07/open-source-pr 阅读全文
posted @ 2019-08-26 16:53 冀子@ 阅读(446) 评论(0) 推荐(0)
摘要: public String getIpaddress() { String ip = getIpaddress(ServletActionContext.getRequest()); return ip; } public static String getIpaddress(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if ((ip == null) || (ip.length() == 0) || ("unknown".equalsIg 阅读全文
posted @ 2012-11-05 20:15 冀子@ 阅读(313) 评论(0) 推荐(0)
摘要: 根据bean的id 读取spring 文件中的bean·servlet中private static ApplicationContext ctx = null; @Override public void init(ServletConfig config) throws ServletException { if(ctx == null){ ctx = WebApplicationContextUtils .getRequiredWebApplicationContext(config.getServletContext()); } }·普通java类中 private 阅读全文
posted @ 2012-10-20 15:20 冀子@ 阅读(1053) 评论(0) 推荐(0)
点击右上角即可分享
微信分享提示