无法加载可扩展计数器_多核可扩展计数器

无法加载可扩展计数器

到处都需要计数器,例如,查找应用程序的关键KPI,应用程序的负载,服务的请求总数,用于查找应用程序吞吐量的一些KPI等。

由于所有这些需求,并发复杂性也增加了,这使这个问题变得有趣。

如何实现并发计数器


  • 同步 –这是JDK 1.5之前的唯一选项,因为现在我们正在等待JDK8发布,因此绝对不是一个选项。
  • 基于锁 –切勿尝试将其用作计数器,否则它将性能很差
  • 等待免费 -Java不支持Fetch-and-add ,因此实现起来有点困难。
  • 无锁 –在“ 比较和交换”的良好支持下,此选项看起来不错。

基于比较和交换的计数器如何执行

我使用AtomicInteger进行此测试,并且每个线程使此计数器递增1百万次,以增加线程的争用数量,并逐渐增加。

试验机详细信息

作业系统:Windows 8

JDK:1.7.0.25

处理器:Intel i7-3632QM,8 Core

内存:8 GB

原子整数

Y轴 –增加一百万次所需的时间

X轴–螺纹数

随着线程数量的增加,增加计数器所花费的时间也增加了,这是由于争用造成的。 对于基于CAS的计数器,是CAS故障导致减速。

这是我们可以获得的最佳性能吗? 肯定不是它们是实现并发计数器的更好的解决方案,让我们来看看它们。

备用并发计数器

让我们看一些实现计数器的解决方案,以更好的方式处理竞争:

  • 基于核心的计数器 –维护每个逻辑核心的计数器,这样您将减少争用。 您拥有这种类型的计数器的唯一问题是,如果线程数大于逻辑核心数,那么您将开始注意到竞争。
  • 基于线程的计数器 –维护计数器以了解将要使用系统的线程总数。 当线程数大于逻辑核心数时,此方法效果很好。

让我们测试一下

不同类型的计数器花费的时间

所有反击-花费的时间

Y轴 –增加一百万次所需的时间

X轴–螺纹数

同时用计数器进行比基于原子计数器要好得多,16个线程是5倍左右的时间比较好,这是巨大的差异!

CAS失效率

反CAS失败

Y轴 – CAS失效100Ks

X轴–螺纹数

由于存在争用,基于原子的计数器会出现很多故障,并且随着我添加更多线程和其他计数器的运行而呈指数级增长。

观察

多核计算机变得易于使用,并且我们必须改变处理并发的方式,而当拥有24或48核服务器的情况很普遍时,传统的并发方式在当今时代将无法扩展。

  • 为了减少争用,您必须使用多个计数器,然后再将它们聚合
  • 如果线程数少于或等于内核数,则基于内核的计数器效果很好
  • 当线程数量远大于可用内核时,基于线程的计数器就很好
  • 减少争用的关键是确定要写入哪个线程的计数器。我使用了基于线程ID的简单方法,但是可以使用更好的方法,请查看JDK 8的ThreadLocalRandom以获得一些想法。
  • JDK8的LongAdder使用基于线程的方法,该方法创建许多插槽以减少争用。

该测试中使用的所有计数器的代码都可以在Github上获得

参考:来自JCG合作伙伴 Ashkrit Sharma的“ 多核可扩展计数器 ”,准备好博客了。

翻译自: https://www.javacodegeeks.com/2013/09/scalable-counters-for-multi-core.html

无法加载可扩展计数器

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

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

相关文章

linux忘记mysql密码_linux下忘记mysql root密码解决办法 | 系统运维

引言:在linux系统中,如果忘记了MySQL的root密码,有没有办法重新设置新密码呢?答案是肯定的,下面教大家一个比较简单的重置MySQL root密码的办法:1、编辑MySQL配置文件my.cnf系统运维www.osyunwei.com温馨提…

Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫

最近,Oracle采用了一种新策略,即每六个月发布一次新的语言版本。 该策略假定只有每个第3版都将提供长期支持或LTS。 快速说明: 具有LTS的当前版本是Java 8; Java 9仅应在2018年3月之前获得支持,因此已经结束。 Java…

mysql从dos界面_从DOS界面进入MYSQL数据库

新手学习数据库,从比较简单的mysql开始。从DOS界面进入mysql数据库其实跟配置java环境变量一样,要先设置环境变量(右击我的电脑-属性-高级-环境变量)。找到mysql的安装位置,把安装目录下“...mysql\bin\"这个地址放到环境变量Path值中&a…

更快地重复访问Java的Java类名?

Claes Redestad在core-libs-dev邮件列表上发布了消息“ RRF:8187123 :(反映)Class#getCanonicalName和Class#getSimpleName是性能问题的一部分 ”,他在邮件列表中要求审查建议的更改“以启用缓存…

mysql中cast函数_mysql中cast函数的使用 用于强制类型转换 (转载)

例子:SELECTstr_to_date(concat(year(a.tb_time),date_format(a.tb_time,%m),01),%Y%m%d) tb_time,cast(a.category_id as char) category_id,a.category_name,sum(a.tendered_sum)/sum(a.winbid) tendered_sum,sum(a.winbid_sum)/sum(a.winbid) winbid_avgfrom( SE…

dht11温湿度传感器_Arduino不调用库实现DHT11数据读取

DHT11概述DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性…

rete_RIP RETE时间来获得PHREAKY

rete我刚刚完成了有关新规则算法PHREAK的高级文档,PHREAK是混合推理中的一个文字游戏。 它仍然有点粗糙和高水平,但希望仍然很有趣。 它建立在ReteOO之上,非常好阅读。 ReteOO算法 ReteOO是在3、4和5系列发行版中开发的。 它采用了RETE算法并…

mysql 存储过程 插入记录_mysql 存储过程 插入记录

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

Java技巧:创建监视友好的ExecutorService

在本文中,我们将扩展具有监视功能的ExecutorService实现。 这种监视功能将帮助我们在实时生产环境中测量多个池参数,即活动线程,工作队列大小等。 它还将使我们能够衡量任务执行时间,成功任务计数和失败任务计数。 监控库 至于监…

java如果把字符串转成对象_Java中的重复对象:不仅仅是字符串

当Java应用程序消耗大量内存时,它本身就会出现问题,并可能导致GC压力增加和GC暂停时间过长。在我之前的一篇文章中,我讨论了Java中常见的内存浪费源:重复字符串。两个 java.lang.String 对象, a 并 b 在重复时 a ! b &…

mysql五大子句_MySQL的查询语句中可以使用以下哪个子句来表示分组查询

【多选题】人类行为遗传学工作者倾向于把人的行为遗传分为哪几类【填空题】MySQL的连接操作包括内连接、( )和交叉连接。【判断题】社会生活类尤其是人文风光类纪录片的解说则多用文学、 散文手法, 既抒情又有解释说明, 语言华丽富于美感,情感真挚浓郁。【单选题】1 、作业区边…

批处理 设置电脑最佳性能_批处理最佳做法

批处理 设置电脑最佳性能大多数应用程序至少具有一个批处理任务,在后台执行特定的逻辑。 编写批处理作业并不复杂,但是您需要了解一些基本规则,我将列举一些我发现最重要的规则。 从输入类型的角度来看,处理项目可以通过轮询处理…

layui登录页面写入数据_layui基本使用(动态获取数据,并把需要的数据传到新打开的窗口)...

\n‘ ‘ \n‘ ‘ \n‘ ‘ \n‘ ‘ \n‘ ‘ \n‘ ‘ \n‘ ‘ ‘ item.TITLE ‘\n‘ ‘ ‘ item.ZDRQ ‘\n‘ ‘ \n‘ ‘ \n‘ ‘ \n‘ ‘ \n‘ ‘ ‘ item.CDATE ‘\n‘ ‘ ‘ item.TJR ‘\n‘ ‘ \n‘ ‘ \n‘ ‘ ‘‘//消息的跳转页面$(".xiaoxi").click(fu…

mysql 5.6自动任务_mysql定时执行某任务

查看event是否开启: show variables like %sche%;将事件计划开启: set global event_scheduler1;关闭事件任务: alter event e_test ON COMPLETION PRESERVE DISABLE;开户事件任务: alter event e_test ON COMPLETION PRESERVE ENABLE;简单实例.创建表 CREATE TABLE test(endti…

JVM体系结构:JVM类加载器和运行时数据区

各位读者好! 在JVM系列的上一篇文章中,开发人员了解了Java虚拟机(JVM)及其体系结构。 本教程将帮助开发人员正确回答以下主题的问题: ClassLoader子系统 运行时数据区 1.简介 在继续之前,让我们看一下Ja…

mysql flush cache_mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法

转自:http://www.169it.com/article/5994930453423417575.html为了测试sql语句的效率,有时候要不用缓存来查询。使用SELECT SQL_NO_CACHE ...语法即可SQL_NO_CACHE的真正作用是禁止缓存查询结果,但并不意味着cache不作为结果返回给query。目前…

-%3erow mysql_MySQL查询优化

# MySQL查询优化* [请简述项目中优化MySQL语句执行效率的方法,从哪些方面入手,SQL语句性能如何分析?](https://www.kancloud.cn/ranjun940726/php_interview/596348#MySQLSQL_3)* [分析查询速度](https://www.kancloud.cn/ranjun940726/php_i…

apache karaf_Apache Karaf遇到Apache HBase

apache karaf介绍 Apache HBase是一个以Google Bigtable为蓝本的开源,分布式,版本化,面向列的商店。 如果您是普通读者,那么您可能已经知道Apache Karaf是什么,但是对于那些不是的读者:Apache Karaf是一个O…

mysql5.6特性_MySQL5.6新版本特性

MySQL已发布新的系列版本5.6.x,如果打算升级的朋友可以尝试,虽然目前没有收到新版本的使用反馈,但凭借MySQL占据市场份额来看,新版本的确值得期待。五大特性:优化器的改进MySQL Optimizer 团队做了大量的工作为了不断的…

实现threadlocal_ThreadLocal如何实现?

实现threadlocal这是我上周的帖子的后续文章,其中我解释了ThreadLocal用法背后的动机 。 从帖子中我们可以回忆起,如果您希望为每个线程拥有一个独立初始化的变量副本,则ThreadLocal确实是一个很酷的概念。 现在,好奇的人可能已经…