写点什么

如何让代码并发效率更高

  • 2013-08-13
  • 本文字数:2197 字

    阅读完需:约 7 分钟

随着计算硬件的快速发展,多核多处理器已经广泛应用于企业和个人环境中,开发人员利用多线程技术努力提高软件的计算速度,资深系统架构师 Gurudutt Kumar总结了如何让代码并发效率更高的实践经验。

Gurudutt 首先列举了几种影响软件可伸缩性的问题:

  • 效率低下的并行化:单片应用程序或软件无法有效使用可用的计算资源。您需要将应用程序组织成并行任务。在传统的不支持多线程的应用程序或软件中,我们会经常看到这个问题。这些应用程序在多核、多处理器、芯片多线程硬件上无法伸缩,并且无法实现更好的吞吐量。线程太多可能会和线程太少一样,都不会产生好的结果。
  • 串行瓶颈:在多个线程或进程之间共享数据结构的应用程序可能会有串行瓶颈。为了保持数据完整性,可能必须使用锁定和串行化技术(例如,读取锁、读写锁、写入锁、自旋锁、互斥等)将这些共享数据结构的访问串行化。设计得效率低下的锁可能会由于多个线程或进程之间的高度锁争用而导致串行瓶颈,从而尝试获取锁。这可能会潜在地降低应用程序或软件的性能。应用程序的性能可能会随着核心或处理器数量的增加而降低。
  • 对操作系统 (OS) 或运行时环境的过度依赖:您不能依赖操作系统、运行时环境或编译器来完成伸缩应用程序或软件所需的一切操作。但是,编译器和运行时环境可以帮助提供一定的优化,您不能依赖它们解决所有可伸缩性问题。例如,不能依赖 Java™ 虚拟机 (JVM) 通过自动并行来发现 Java 应用程序的最佳可伸缩的机会。
  • 工作负载的不平衡可能是一个瓶颈:工作负载的不均匀分布可能导致无法有效地利用计算资源。您可能必须将较大的任务划分成可以并行运行的较小的任务,还可能必须将串行算法更改为并行算法,以便提高性能和可伸缩性。
  • I/O 瓶颈:由于阻止磁盘输入 / 输出 (I/O) 或高网络延迟而导致的瓶颈可能会严重抑制应用程序的可伸缩性。
  • 无效的内存管理:在多核平台上,因为有很多处理单元,因此纯计算可能非常廉价,并且主要内存可能也不是问题,因为它正在变得越来越大。但是,内存带宽一直是一个瓶颈,因为所有处理器核心都贡献了一个通用的总线。无效的内存管理可能导致一些难以检测到的性能问题,比如伪共享。

以“避免内存争用”为例,Gurudut 做了解释:

在内存和缓存中,各种不同的核共享一个通用的数据区域,这需要在它们之间进行同步。当不同的核同时访问同一个数据区域时,会发生 _ 内存争用 _。在不同的核之间同步数据会因总线通信、锁定成本以及缓存缺失而有很大的性能损失。如果应用程序有多个线程,并且所有线程都更新或修改同一个内存地址,那么正如前面部分所讨论的那样,为了保持缓存一致性,可能会产生一次重大的乒乓效应。这会导致性能降低。

如何避免内存争用呢?Gurudut 认为“不要在核之间共享可写入的状态”:

  • 为了最大程度地减少内存总线通信,可以通过最小化共享位置 / 数据尽可能地减少核心交互,即使共享数据没有锁保护,而有一些硬件级别原子指令(如 Microsoft® Windows® 32 位平台上的 InterlockedExchangeAdd64)保护也是如此。
  • 减少线程之间的内存争用的一个方法是从多个线程中消除对共享内存区域的更新。例如,即便是在多个线程需要更新全局计数器或累计总数(如统计数据)时,各个线程也可以保持线程本地总数,并让全局总数仅在需要时通过一个通用的线程进行更新。因此,在共享内存区域上的争用会大大减少。
  • 趋向于减少锁争用的模式会减少内存通信,因为它是一个共享的可写入状态,该状态需要使用锁并产生争用。

对于锁争用,Gurudut 认为要从“避免”和“减少”两个方面来解决这个问题:

避免

  • 避免在数据结构中发生锁争用的方法之一是采用并发数据结构设计和无锁算法,这会消除锁以及传统的同步技巧(比如互斥)。有多种并发数据结构的设计并不需要利用同步机制,比如互斥。
  • 无锁算法的一些示例如下:
    • 使用 相对论编程 的可伸缩并发哈希表:该技巧的最简单示例是 Read Copy Update (RCU) ,它专用于 Linux 内核,大大提高了 Linux 内核的性能,并简化了 Linux 内核的代码。
    • 无锁可扩展有序分割的哈希列表:这个无锁递归可扩展哈希算法使用了无锁的链接列表,这些列表使用原子指令来修改链接的列表。
  • 在 Linux 内核中,广泛使用了每处理器变量,系统上的每个处理器都获得了自己的一个给定变量的副本。访问每处理器变量不需要使用锁,此外,因为在不同的处理器上,这些变量未在线程之间共享,因此没有伪共享或内存争用。这种技巧非常适合收集统计信息。

减少

  • 当使用传统锁或同步技巧(如自旋锁)时,必须注意的是,不要使用单片锁或全局锁,而是将这些锁分成更细小的部分。因此,锁会保护数据结构中的某个特定区域以及较小的区域。这样多个线程就能够通过获取保护这些成员的相应锁,在同一数据结构的不同成员上并发进行操作。这种方法可以实现更多并发。
  • 甚至当软件设计中的同步机制能够实现更好的并发和减少锁争用时,也可能会由于伪共享而导致发生性能问题。例如,考虑一个哈希数据结构。如果存在一个自旋锁数组,用于保护哈希中的每个哈希桶,那么在自旋锁数组中可能会出现伪共享。两个线程在两个不同的处理器上运行,每个线程都锁定哈希中的不同哈希桶,那么当它们所需的自旋锁位于同一个缓存行上时,可能会发生伪共享。因此,在设计此类算法时需要考虑采用避免发生伪共享的通用技巧。

作者的微信公众号“老崔瞎编”,关注 IT 趋势,承载前沿、深入、有温度的内容。感兴趣的读者可以搜索 ID:laocuixiabian,或者扫描下方二维码加关注。

2013-08-13 03:156111
用户头像

发布了 501 篇内容, 共 257.5 次阅读, 收获喜欢 61 次。

关注

评论

发布
暂无评论
发现更多内容

系统召回太慢?上 Milvus × PaddleRec 双剑合璧大法!

Zilliz

数据库 推荐算法 召回 向量检索

盘点后端领域的点点滴滴 | 引航计划|后端

xcbeyond

后端 引航计划 内容合集 技术专题合集

OBServer启动恢复解析

OceanBase 数据库

oceanbase OceanBase 开源 OceanBase 数据库大赛

汽车域控制器分类(下):自动驾驶域控制器、车身域控制器

SOA开发者

什么是激光雷达的“发动机技术”?一文讲透行业技术壁垒 (一)

SOA开发者

直播回顾 | 云和恩墨范计杰:Oracle DBA的SQL编写技能提升宝典(含SQL资源)

墨天轮

oracle sql 函数

看一遍就理解:MVCC原理详解

Java MySQL 架构 面试 后端

第 13 章 -《Linux 一学就会》- Linux文件系统结构

学神来啦

Linux 运维 linux学习

上汽零束汽车智能应用创意大赛,初赛作品评选将启动!

SOA开发者平台

什么是激光雷达的“发动机技术”?一文讲透行业技术壁垒(二)

SOA开发者

华为云GaussDB(for openGauss) 同城双集群高可用方案正式发布

华为云数据库小助手

GaussDB GaussDB(for openGauss) 华为云数据库

细节理解!阿里内部Java高并发系统设计全彩手册曝光!霸榜GitHub

进击的王小二

Java 架构 高并发 Java性能调优

9. python 入门教程快速复习,序列,数值类型,字符串方法,列表、集合、字典方法,文件操作,解析式

梦想橡皮擦

10月月更

不可思议!阿里大佬熬夜9天整理出749的HotSpot VM源码笔记

Java 架构 面试 程序人生 编程语言

聊一聊物联网嵌入式芯片的内容结构

华为云开发者联盟

物联网 内存 存储 嵌入式 芯片

汽车域控制器(上):动力域控制器、底盘域控制器、智能座舱域控制器

SOA开发者

腾讯面试聊到的几种存储虚拟化

hanaper

爱奇艺数据质量监控的探索和实践

爱奇艺技术产品团队

监控 数据治理 pingback

Vue进阶(幺贰捌):Vue插槽:slot、slot-scope与指令v-slot应用讲解

No Silver Bullet

Vue 插槽 10月月更

架构实战营 毕业设计项目

蔸蔸

在GitHub标星86k+霸榜的某宝Redis核心原理深度实践PDF限时开源!

Java 架构 面试 程序人生 编程语言

华为技术官珍藏版:SpringBoot全优笔记,面面俱到,实在太全面了

Java 架构 面试 微服务 后端

211本+985硕+计算机专业投面百度,坐等一周迎来三面,已拿offer

Java 程序员 架构 编程语言

上汽零束汽车智能应用创意大赛,初赛作品评选将启动!

SOA开发者

模块八:设计消息队列存储消息数据的MYSQL表格

kk

架构训练营

高并发中的 限流、熔断、降级、预热、背压!

进击的王小二

高并发 java

Superior Scheduler:带你了解FusionInsight MRS的超级调度器

华为云开发者联盟

大数据 hadoop 开源 调度器 FusionInsight MRS

语音翻译器 Tech Support

凌天一击

深度解读 | 《2021年中国企业级 SaaS 行业研究报告》趋势剖析

万事ONES

SaaS 研发管理工具 ONES

想了解Xtrabackup备份原理和常见问题分析,看这篇就够了

华为云开发者联盟

MySQL 数据库 华为云 备份 XtraBackup

“云智一体”系列白皮书智能视频篇来了!

百度大脑

人工智能

如何让代码并发效率更高_语言 & 开发_崔康_InfoQ精选文章