mysql提高吞吐量_垃圾收集:提高吞吐量

mysql提高吞吐量

全蛇 这篇文章的灵感来自于在内存管理术语表中碰到“ Pig in the Python ”的定义之后。 显然,该术语用于解释GC反复促进大对象世代相传的情况。 据推测,这样做的效果类似于Python吞下整个猎物,只是在消化过程中被固定住了。

在接下来的24小时里,我简直无法理解Python的窒息。 就像精神病医生所说的那样,消除恐惧的最好方法就是谈论它们。 所以我们开始。 但是,除了Python,Python的其余部分将涉及垃圾回收优化。 我承诺。

垃圾收集暂停是众所周知的性能瓶颈。 现代JVM确实带有高级垃圾收集器,但是据我所知,为特定应用程序找到最佳配置仍然很困难。 为了甚至有机会手动解决该问题,人们需要了解垃圾收集算法的确切机制。 这篇文章也许可以在这方面为您提供帮助,因为我将使用一个示例来演示JVM配置中的微小更改如何影响您的应用程序的吞吐量。

我们用来演示GC对吞吐量影响的应用程序很简单。 它仅包含两个线程:

  • PigEater –模拟一种情况,Python不断吃掉另一头猪。 该代码通过在java.util.List中添加32MB字节并在每次尝试后Hibernate100ms来实现此目的。
  • PigDigester –模拟异步摘要过程。 该代码仅通过使该猪列表无效来实现消化。 由于这是一个相当累的过程,因此在每次参考清洁后,该线程将睡眠2000毫秒。

两个线程都会在while循环中运行,继续吃和消化,直到蛇吃饱为止。 大约有5,000头猪被吃掉。

package eu.plumbr.demo;public class PigInThePython {static volatile List pigs = new ArrayList();static volatile int pigsEaten = 0;static final int ENOUGH_PIGS = 5000;public static void main(String[] args) throws InterruptedException {new PigEater().start();new PigDigester().start();}static class PigEater extends Thread {@Overridepublic void run() {while (true) {pigs.add(new byte[32 * 1024 * 1024]); //32MB per pigif (pigsEaten > ENOUGH_PIGS) return;takeANap(100);}}}static class PigDigester extends Thread {@Overridepublic void run() {long start = System.currentTimeMillis();while (true) {takeANap(2000);pigsEaten+=pigs.size();pigs = new ArrayList();if (pigsEaten > ENOUGH_PIGS)  {System.out.format("Digested %d pigs in %d ms.%n",pigsEaten, System.currentTimeMillis()-start);return;}}}}static void takeANap(int ms) {try {Thread.sleep(ms);} catch (Exception e) {e.printStackTrace();}}
}

现在让我们将该系统的吞吐量定义为“每秒消化的猪的数量”。 考虑到每100毫秒后将猪塞入python,我们看到该系统的理论最大吞吐量因此可以达到10头/秒。

配置GC示例

让我们来看一下使用两种不同配置的系统行为。 在所有情况下,该应用程序都是使用具有8G物理内存的双核Mac(OS X 10.9.3)运行的。

第一种配置:

  • 4G堆( -Xms4g –Xmx4g
  • 使用CMS清理旧的(-XX:+ UseConcMarkSweepGC )并并行清理年轻的-XX:+ UseParNewGC
  • 已将堆的12,5%(- Xmn512m )分配给了年轻一代,从而进一步将Eden和Survivor空间的大小限制为相同大小。

第二种配置有些不同:

  • 2G堆( -Xms2g –Xmx2g
  • 使用并行GC在年轻一代和终身一代中进行垃圾收集( -XX:+ UseParallelGC
  • 已将堆的75%分配给年轻一代( -Xmn1536m

现在该下赌注了,哪种配置在吞吐量方面表现更好(每秒吃掉的猪,还记得吗?)。 你们那些花钱买第一种配置的人,我一定会让您失望的。 结果完全相反:

  • 第一种配置(大堆,大旧空间,CMS GC)每秒可以吃掉8.2头猪
  • 第二种配置(较小的堆2倍,较大的幼小空间,并行GC)每秒可吞噬9.2头猪

现在,让我对结果进行透视。 少分配2倍的资源(在内存方面),我们的吞吐量提高了12% 。 这与常识相反,可能需要进一步澄清实际发生的情况。

解释GC结果

您所面对的原因并不是太复杂,而当您更仔细地观察GC在测试运行过程中的行为时,答案就直盯着您。 为此,您可以使用自己选择的工具,我在jstat的帮助下进行了深入研究,类似于以下内容

jstat -gc -t -h20 PID 1秒

查看数据,我注意到第一个配置经历了1,129个垃圾回收周期(YGCT + FGCT),总共花费了63.723秒:

Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   
594.0 174720.0 174720.0 163844.1  0.0   174848.0 131074.1 3670016.0  2621693.5  21248.0 2580.9   1006   63.182  116 	0.236   63.419
595.0 174720.0 174720.0 163842.1  0.0   174848.0 65538.0  3670016.0  3047677.9  21248.0 2580.9   1008   63.310  117 	0.236   63.546
596.1 174720.0 174720.0 98308.0 163842.1 174848.0 163844.2 3670016.0   491772.9  21248.0 2580.9   1010   63.354  118 	0.240   63.595
597.0 174720.0 174720.0  0.0   163840.1 174848.0 131074.1 3670016.0   688380.1  21248.0 2580.9   1011   63.482  118 	0.240   63.723

第二种配置总共暂停了168次(YGCT + FGCT),仅11.409秒。

Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   
539.3 164352.0 164352.0  0.0    0.0   1211904.0 98306.0   524288.0   164352.2  21504.0 2579.2 	27    2.969  141 	8.441   11.409
540.3 164352.0 164352.0  0.0    0.0   1211904.0 425986.2  524288.0   164352.2  21504.0 2579.2 	27    2.969  141 	8.441   11.409
541.4 164352.0 164352.0  0.0    0.0   1211904.0 720900.4  524288.0   164352.2  21504.0 2579.2 	27    2.969  141 	8.441   11.409
542.3 164352.0 164352.0  0.0	0.0   1211904.0 1015812.6  524288.0   164352.2  21504.0 2579.2 	27	2.969  141 	8.441   11.409

考虑到在这两种情况下需要进行的工作在以下方面是等效的:–在看不到长寿物体的情况下,GC在此养猪活动中的职责只是尽可能快地摆脱一切。 使用第一种配置,GC仅被迫运行约6.7倍,导致总暂停时间延长约5.6倍。

因此,这个故事实现了两个目的。 首先,最重要的是,我希望我能从头上看到一条令人窒息的Python的照片。 另一个更重要的收获是–调整GC充其量是一项棘手的练习,需要深刻理解几个基本概念。 即使使用本博客文章中使用的真正琐碎的应用程序,您将要面对的结果也会对吞吐量和容量规划产生重大影响。 在实际应用中,差异甚至更大。 因此,选择是您的选择,您既可以掌握概念,也可以专注于日常工作,并让Plumbr根据您的需求找到合适的GC配置 。

翻译自: https://www.javacodegeeks.com/2014/09/garbage-collection-increasing-the-throughput.html

mysql提高吞吐量

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

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

相关文章

honeyselect捏脸教程_动漫女生的脸怎么画?卡通漫画少女教学

动漫女生的脸怎么画?卡通漫画少女教学!我们知道,人类的审美是具有时代特征的。在不同的历史时期,人们的审美会发生变化。举个栗子:“楚王好细腰,宫中多饿死”“燕瘦环肥”、魏晋时期的男风盛行、初唐的“肤…

手机怎么进ph_明日发布,华为鸿蒙OS2.0手机版特色功能曝光

阅读本文前,请您先点击上面的蓝色字体,再点击“关注”,这样您就可以免费收到最新内容了。每天都有分享,完全是免费订阅,请放心关注。声明:本文转载自网络,如有侵权,请在后台留言联系…

清华大学 张春良 计算机系,南京张春良老师小学生信息学辅导

南师大张老师信息编程师资团队小学信息学的教学如今小学生对计算机的兴趣越来越强,使用计算机的时间也越来越多。许多聪慧的孩子无意之间,为追求控制感、成功感,沉溺进了电脑游戏,令家长、教师扼腕叹息。信息学培训,引…

json 在后天怎么接_长相显老怎么办?以同岁的马伊琍和刘敏涛为例,解析显年轻的技巧...

短发女王马伊琍和最近上热搜的刘敏涛都是1976年出生,今年44岁,但是当两人同框时,即使相同的脸型和服饰,马伊琍显得很年轻,而刘敏涛却像是隔代人,真的好尴尬。这是什么原因呢?其实她们的尴尬&…

java8 streams_当Java 8 Streams API不够用时

java8 streamsJava 8与往常一样是妥协和向后兼容的版本。 JSR-335专家组可能尚未与某些读者就某些功能的范围或可行性达成一致的版本 。 请参阅Brian Goetz关于为什么…的一些具体解释。 …Java 8默认方法中不允许“最终” …Java 8默认方法中不允许“同步” 但是今天&#…

计算机软考初级工程资料,计算机软考网络工程师复习资料及习题(一)

1、 若是serial0 is up, line protocol is up表示该端口工作正常。2、若是serial 0 is down, line protocol is down表示路由器到本地的modem之间无载波信号cd。连接串口和 modem,开启modem.看modem的发送灯td是否亮,td灯亮表示路由器有信号发送给modem.td灯若不亮,…

计算机硬盘瓶颈,为何你的电脑卡的飞起,看看是不是遇到存储瓶颈

原标题:为何你的电脑卡的飞起,看看是不是遇到存储瓶颈存储一直是笔记本电脑的性能瓶颈之一,同时还关系到电池续航时间。除了一颗性能澎湃的处理器之外,更多人困惑的是硬盘存储配置的选择。硬盘不仅有容量属性,更是影响…

JMetro版本8.6.11和11.6.11已发布

你好 JMetro的另一个版本。 这次已重新设置了2个新控件的样式,错误修复和其他一些小的调整。 我希望你们在这个陌生的时代都能安然无well。 继续阅读以获取详细信息。 新的ColorPicker样式 以下是新的ColorPicker样式LIGHT和DARK的动画: ColorPicker…

c#中overlord实例_具有Overlord的WildFly 8.1中的API管理

c#中overlord实例昨天,我简要介绍了霸王项目家族。 今天是时候进行试驾了。 API管理子项目两天前发布了1.0.0.Alpha1,并根据18个月的路线图介绍了第一组功能。 APIMan到底是什么? 它是一个API管理系统,可以嵌入到现有框架或应用程…

计算机病毒需要附着在,计算机病毒是如何传播的?

满意答案Fixedburn2019.10.24采纳率:53% 等级:8已帮助:7262人1、各种网络传播(1)电子邮件电子邮件是病毒通过互联网进行传播的主要媒介。病毒主要依附在邮件的附件中,而电子邮件本身并不产生病毒。当用户下载附件时&#xff0c…

使用适用于Java 2的AWS开发工具包的AWS DynamoDB版本字段

将任何实体上的版本属性保存到 AWS DynamoDB数据库,它仅是表示实体已修改次数的数字表示。 首次创建实体时,可以将其设置为1,然后在每次更新时递增。 好处是立竿见影的-指示实体已被修改的次数,可用于审核实体。 此外&#xff0…

win7计算机个性化设置,笔记本电脑windows7系统如何用好电脑个性化设置

笔记本电脑windows7系统想要用好电脑个性化设置,该怎么办呢,下面是学习啦小编收集整理的笔记本电脑windows7系统如何用好电脑个性化设置,希望对大家有帮助~~笔记本电脑windows7系统用好电脑个性化设置的方法右击桌面空白区域,在弹…

发动机冷启动和热启动的区别_「牛车实验室」AGM自动启停蓄电池解读 和普通蓄电池到底有什么区别...

[资讯-牛车网]为了节省燃油,越来越多的新车搭载了自动启停功能。搭载了这项功能的汽车,都会随之搭配一块独立的自动启停蓄电池,这块电池只单独为自动启停系统工作。那么同是蓄电池,自动启停电池和普通蓄电池有什么区别&#xff0c…

返回内容验签失败_邮件经常失败回弹很糟心?一定要知道这几个小知识

很多人都反应每次发送邮件,总有一部分发生失败回弹,大大影响了送达率,非常糟心!今天我们为大家整理了一些常见关于发送回弹状态的相关知识以及如何避免邮件回弹的注意事项。一、回弹状态的两种类型邮件发送失败时ESP(邮件供应服务…

用火狐录制脚本为空_功能测试——链接测试amp;脚本功能

链接测试对于页面链接功能,测试工程师需考虑其链接文字描述正确性、链接地址跳转正确性、链接触发脚本正确性、是否存在404错误等。如果是小型Web系统,链接较少,人工测试即可,如果被测对象包含很多链接,则可利用Xenu链…

笔记本电脑显示打印机服务器关闭,笔记本win10系统的打印机服务怎么禁用或重启...

笔记本win10系统的打印机服务怎么禁用或重启腾讯视频/爱奇艺/优酷/外卖 充值4折起在我们的生活中,如果打印机出错了,我们就需要关闭打印机或者重启打印机,那么笔记本的win10系统禁用/启动打印机服务方法是什么呢?下面小编告诉大家…

junit runner_了解JUnit的Runner架构

junit runner几周前,我开始创建一个小的JUnit Runner( Oleaster ),它允许您使用Jasmine方式在JUnit中编写单元测试。 我了解到,创建自定义JUnit Runners实际上非常简单。 在这篇文章中,我想向您展示JUnit R…

php 邮件服务器 群发,发送使用PHP群发电子邮件发送使用PHP群发电子邮件(Sending mass email usin...

我目前正在写一个音乐博客。 管理员发布一个新的文章每2-3天。 一旦管理员岗位的文章,群发电子邮件将被立即发送到5000左右的用户。什么是实现群发邮件功能的最佳方法是什么?请问下面的函数工作?function massmail(){$content ...;foreach (…

linq判断集合中相同元素个数_iOS开发swift语法梳理:集合Set

1.集合的三特性确定性:给定一个集合,任意给一个元素,该元素或者属于或者不属于该集合,二者必居其一。互斥性:一个集合中的所有元素都是不相同的。无序性:每个元素的地位相同,元素之间是无序的。…

python监控服务器信息,Python监控服务器实现邮件微信报警

本文中笔者暂时实现的只有cpu和内存的监控,python可以监控许多的主机信息,网络,硬盘,机器状态等,以下是代码的实现,代码可以实现windows和 linux 的监控。实验环境:Ubuntu16.04和windos10&#…