java 提高性能的 容器库_容器隔离性带来的问题--容器化Java应用比虚机启动速度慢...

引发的问题

同等配置下,虚机中的java 服务的启动速度,要比容器快很多(将近两倍)

实测数据

在同是1c1g的虚机和容器中,虚机启动时间大概在1min20s,容器启动时间大概在2min40s。

排查思路

怀疑网络

最开始怀疑是网络问题,因为业务依赖外部数据库,在容器和虚机中ping、telnet外部数据库,能通而且延迟差不多。

咨询熟悉java的小伙伴,说 spingboot可能有潜在的外部网络请求延迟(如请求Spring官网等),请求可能多次失败超时,不影响服务启动,但会影响启动时间。通过在虚机和容器中抓包,抓到了一个外部域名,但是虚机容器中都可以正常联通。包括修改域名服务器,都没有效果

硬件差异

排查问题陷入僵局后,咨询小伙伴的建议,涛哥提出是不是因为硬件差异导致的?这是个新的思路,之前只关注了软件层面的。

google了下,确实有人遇到了因为cpu频率的差异,导致虚机和容器中业务性能的差异。查看了容器和虚机所在主机的cpu频率后,进一步证实了涛哥的猜想,cpu频率确实有将近一倍的差异。根据文章中提供的解决办法,通过修改cpu的工作模式,从

powersave到performance,来提高cpu的工作频率。命令如下:

# 查看cpu频率

# lscpu

Architecture: x86_64

CPU op-mode(s): 32-bit, 64-bit

Byte Order: Little Endian

CPU(s): 48

On-line CPU(s) list: 0-47

Thread(s) per core: 2

Core(s) per socket: 12

Socket(s): 2

NUMA node(s): 2

Vendor ID: GenuineIntel

CPU family: 6

Model: 79

Model name: Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz

Stepping: 1

CPU MHz: 2494.133

CPU max MHz: 2900.0000

CPU min MHz: 1200.0000

BogoMIPS: 4389.67

Virtualization: VT-x

L1d cache: 32K

L1i cache: 32K

L2 cache: 256K

···

# 查看cpu工作模式

# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

powersave

powersave

...

# 修改cpu工作模式

# cpupower -c all frequency-set -g performance

# 查看每个cpu的频率

# grep -i mhz /proc/cpuinfo

cpu MHz : 1870.495

cpu MHz : 2348.156

cpu MHz : 2160.900

cpu MHz : 1918.896

···

在修改完cpu工作模式后,cpu MHz确实有很大的提高,但是实测容器中业务启动时间并没有预期的和虚机中的速度一样,只有一点优化。看来cpu MHz不是决定的影响因素。

后来详细查了一下,cpu MHz是个不断浮动的素质,cpu性能要看CPU max MHz和工作模式。两台宿主机的cpu型号是一致的,改动cpu工作模式影响有限

容器对java的隔离缺陷

在之前容器化java业务的时候就遇到了OOMKilled,以及Runtime.getRuntime().availableProcessors()获取的cpu核数问题。当时通过引入了lxcfs,以及替换jvm libnumcpus.so文件,通过环境变量注入cpu核数来解决这个问题。

在怀疑是隔离引起的问题后,对比了虚机和容器中java进程的线程数,发现确实有比较大的差异。命令如下:

# 虚机中

···

[root@data-message-b69c847c7-sjlrx /]# cat /proc/136/status |grep Threads

Threads: 42

[root@data-message-b69c847c7-sjlrx /]# cat /proc/136/status |grep Threads

Threads: 42

[root@data-message-b69c847c7-sjlrx /]# cat /proc/136/status |grep Threads

Threads: 42

[root@data-message-b69c847c7-sjlrx /]# cat /proc/136/status |grep Threads

Threads: 42

[root@data-message-b69c847c7-sjlrx /]# cat /proc/136/status |grep Threads

Threads: 42

[root@data-message-b69c847c7-sjlrx /]# cat /proc/136/status |grep Threads

Threads: 42

···

# 容器中

···

[root@data-message-79bb65797d-ffsfb /]# cat /proc/42/status |grep Threads

Threads: 74

[root@data-message-79bb65797d-ffsfb /]# cat /proc/42/status |grep Threads

Threads: 74

[root@data-message-79bb65797d-ffsfb /]# cat /proc/42/status |grep Threads

Threads: 76

[root@data-message-79bb65797d-ffsfb /]# cat /proc/42/status |grep Threads

Threads: 76

[root@data-message-79bb65797d-ffsfb /]# cat /proc/42/status |grep Threads

Threads: 76

···

解决办法

使用包含了cpu-online /sys/devices/system/cpu/online的lxcfs(我们之前引入的lxcfs还未支持cpu-online)

在引入新版lxcfs cpu-online后,线程数下降明显,启动速度有明显的改善,达到和虚机同等水平。

LXCFS 3.1.2 has been released

Virtualize /sys/devices/system/cpu/online

LXCFS now also partially virtualizes sysfs. The first file to virtualize is /sys/devices/system/cpu/online per container.

结论

容器java进程启动慢的最终原因,还是容器的隔离性不够,导致jvm启动过多的线程,线程频繁切换带来的性能下降。目前使用包含cpu-online的lxcfs能解决这个问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL5.6 PERFORMANCE_SCHEMA 说明

背景: MySQL 5.5开始新增一个数据库:PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.5默认是关闭的,…

php api查询开发,PHP开发API接口(注册、登录、查询用户信息)的实例代码

本节主要内容:php开发API接口的实现代码一、PHP API接口的服务端部分复制代码 代码示例:/*** PHP开发API接口 服务端* edit: www.jbxue.com*/require conn.php;header(Content-Type:text/html;charsetutf-8);$action $_GET[action];switch ($action) {//注册会员ca…

json字符串与json对象之间的转换

字符串转对象(strJSON代表json字符串) var obj eval(strJSON); (运用时候需要除了eval()以外需要json.js包) var obj strJSON.parseJSON(); var obj JSON.parse(strJSON); json对象转字符串(obj代表json对象) var str obj.toJSONS…

ubuntu php 解析,ubuntu运行后台php服务详解

创建一个php服务脚本,该脚本负责抓取mqtt等通信记录,并且保存到数据库。平时,我们只要在服务器端开个终端,就可以运行代码,去抓数据,但是将终端关闭后,就无法抓取数据了。守护进程(daemon)就是一…

04_类与对象_课程动手动脑问题以及课后实验性问题及解答集锦

Answer: 动手动脑: 1——以下代码为何无法通过编译?哪儿出错了? Answer: 因为类Foo的构造函数是有一个参数的,所以我们在new一个Foo类的对象时必须赋予一个符合条件的实参。 2—— 请运行TestStaticInitializeBlock.java示例&…

php如果能编译就完美了,centos7 完美编译PHP7 php-7.2.10.tar.gz

1.下载去官网下载。2、上传并解压tar -zxvf php-7.2.10.tar.gz3、进入文件夹cd php-7.2.104、安装相关依赖包yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel gd gd-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel e2fsprogs e…

UVA - 11246 - K-Multiple Free set(容斥原理)

题意&#xff1a;给定n&#xff08;1 < n < 10^9&#xff09;和k&#xff08;1 < k < 100&#xff09;&#xff0c;从1~n中选尽量多的整数&#xff0c;使的任意两个整数之间都不是k倍的关系。 容斥原理&#xff0c;&#xff08;例如n 20&#xff0c;k 3&#xff…

2017年php还能火多久,PHP还会火吗?

据不完全数据得知&#xff0c;我国对PHP人才非常紧缺&#xff0c;大约每年有50万人左右。伴随着近几年信息化&#xff0c;智能化&#xff0c;网络化的发展&#xff0c;PHP的发展前景也是不可估量的&#xff0c;那么&#xff0c;你知道是什么影响PHP继续火热的吗?下面我们就来分…

[JZOJ P1288] [DP]矩阵取数

kaike 传送门 07年noipT3&#xff1f; 要我写我肯定放弃 嗯没错就是这么果断 据说要 高精 DP 状态&#xff1f; 举例说明&#xff0c;假设有矩阵 a1,a2,a3,a4....an b1,b2,b3,b4....bn 假设矩阵的最大得分取法为 a1*2b1*2a2*4b2*4a3*8b3*8.....an*2^nb2*2^n&#xff1b; 可以转…

php留言板实现留言评价,PHP实现留言板功能的思路

本文实例为大家分享了php留言板的实现思路&#xff0c;供大家参考&#xff0c;具体内容如下1.创建一个存放留言信息的文件名2.获取表单中的数据给一个变量3.判断文件的时候存在4.对文件执行写的操作&#xff0c;在这之前&#xff0c;注意打开文件的时候&#xff0c;选择对文件的…

jQuery 获取页面元素的属性值

获取浏览器显示区域&#xff08;可视区域&#xff09;的高度 &#xff1a; $(window).height(); 获取浏览器显示区域&#xff08;可视区域&#xff09;的宽度 &#xff1a;$(window).width(); 获取页面的文档高度 $(document).height(); 获取页面的文档宽度 &#xf…

php解析xml数据格式,PHP解析xml格式数据工具类实例分享

本文主要介绍了PHP解析xml格式数据工具类,涉及php针对xml格式数据节点添加、获取、解析等相关操作技巧,需要的朋友可以参考下&#xff0c;希望能帮助到大家。本文实例讲述了PHP解析xml格式数据工具类。分享给大家供大家参考&#xff0c;具体如下&#xff1a;class ome_xml {/**…

Linux命令入门

// 查看日历cal // 修改密码passwd // 查看目录和文件ls -lls // 查看当前用户信息whoami // 查看当前在线用户userswho 在Linux中&#xff0c;可以使用 vi 编辑器创建一个文本文件&#xff0c;例如&#xff1a;$ vi filename上面的命令会创建文件 filename 并打开&#xff0c;…

php 动态参数,php怎么实现动态传参数?

先贴代码&#xff0c;代码精简了。$invoker_function($argus);}}?>描述&#xff1a;程序是在ThinkPHP开发&#xff0c;目的是把Cache的get方法接收的参数转发到指定的方法上&#xff0c;最后一行&#xff1a;其中D方法是ThinkPHP自带的方法用的是单例模式。如果不加参数$ar…

Bug2算法的实现(RobotBASIC环境中仿真)

移动机器人智能的一个重要标志就是自主导航&#xff0c;而实现机器人自主导航有个基本要求——避障。之前简单介绍过Bug避障算法&#xff0c;但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象&#xff0c;只能说似懂非懂。我不是天才&#xff0c;不能看几遍就理解理论中…

php l方法,ThinkPHP的L方法使用简介

thinkPHP的L方法用于启用多语言的情况下&#xff0c;设置和获取当前的语言定义。其调用格式为&#xff1a;L(语言变量[,语言值])1.设置语言变量除了使用语言包定义语言变量之外&#xff0c;我们可以用L方法动态设置语言变量&#xff0c;例如&#xff1a;L(LANG_VAR,语言定义);语…

linux-pcap 抓包程序框架

转&#xff1a;http://blog.chinaunix.net/uid-21556133-id-120228.html libpcap详解2010-12-01 22:07libpcap&#xff08;Packet Capture Library&#xff09;&#xff0c;即数据包捕获函数库&#xff0c;是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户…

策略模式场景举例

容错恢复机制 容错恢复机制是应用程序开发中非常常见的功能。那么什么是容错恢复呢&#xff1f;简单点说就是&#xff1a;程序运行的时候&#xff0c;正常情况下应该按照某种方式来做&#xff0c;如果按照某种方式来做发生错误的话&#xff0c;系统并不会崩溃&#xff0…

php写抢票脚本,火车票抢票python代码公开揭秘!

市场上很多火车票抢票软件大家应该非常熟悉&#xff0c;但很少有人研究具体是怎么实现的&#xff0c;所以觉得很神秘&#xff0c;其实很简单。下面使用Python模拟抢票程序&#xff0c;给大家揭秘抢票到底是怎么回事。该代码仅供参考&#xff0c;主要用于大家沟通交流&#xff0…

python不用加号实现加法

问题: Calculate the sum of two integers a and b, but you are not allowed to use the operator and -.Example:Given a 1 and b 2, return 3. class Solution(object):def getSum(self, a, b):""":type a: int:type b: int:rtype: int"""…