计算密集型

计算密集型分布式内存存储和运算平台架构

避嫌声明:所有图文都是根据自己的理解原创,且已离开这家公司三年以上,不存在保密协议,写此文只是用来分享知识、探究不足。

牢骚:本来想弄个ppt交互展示的,不过我的js权限还没批。。。

1. 相关概念

1.1 内存数据库

关系型数据库处理永久、稳定的数据,内存数据库就是将其数据放在内存中,活动事务只与内存数据打交道,重新设计了体系结构并且在数据缓存、快速算法、并行操作方面也进行了相应的改进,所以数据处理速度比磁盘数据库要快很多,一般都在10倍以上。但它不容易恢复,可能暂时不一致或非绝对正确的,要求较大的内存量,而64位操作系统可以支持更大的地址(2T),为内存数据库的实现提供了可能。

1.2 计算密集型

计算密集型是指,每个请求的命令中,大都包含不同的参数值,很难重用前一次计算的结果,所以要按照约定的业务逻辑重新计算,并按照约定的格式返回数据,且计算在总耗时中占比较大。

2. 数据存储

2.1 DB

数据存储在DB中,直接访问数据库。但数据库压力太大,系统瓶颈明显。

2.2 DB + All In One Cache

将DB中的数据加载到节点的内存中,并定时从数据更新日志库中读取来更新内存的数据,极大减轻数据库的压力。

但随着数据的膨胀,节点启动加载慢,升级时间长,宕机恢复难等。

2.3 DB + File + All In One Cache

每天晚上从DB读取数据,生成带有数据同步标识的数据文件,分发到各个服务器节点。节点启动时,直接从本地数据文件加载,大大提高了启动速度。

但随着DB中数据的更新,实例间数据不一致性严重。

2.4 DB + File + All In One Cache + AMQ Sync

通过DP服务定时监控数据更新日志库中的记录,通过AMQ发布给订阅的每个节点,节点根据当前同步的标识决定是否处理消息记录,根据消息记录的属性执行具体的增删改操作,使得数据的一致性较好。

但单个节点内存过大,大数据量时仍会变慢,卡顿现象频繁且耗时较长。

2.5 DB + File + Distributed Cache + AMQ Sync

按照业务将数据拆分到不同的节点上,通过管理节点分配任务,使得内存大小可控,卡顿频率和耗时明显减少。

但生产bug、业务逻辑变更或新增需求时,只能重启服务,不够灵敏,可维护性差。

2.6 DB + File + Distributed Cache + AMQ Sync +CodeDom

利用CodeDom实现动态编译,在运行时增加或修改业务逻辑。

另外,可以为每个节点对应一个独立的DataProcess。

3. 数据运算

3.1 存储过程

将业务逻辑写到存储过程中,难以维护,请求排队现象严重。

3.2 内存运算

通过缓存节点的中间层对外提供服务,在缓存数据的基础上,提供:获取单个运算结果的API(对外),获取数据集合的Enumerator(对内),获取数据运算结果集合的Report(对外),内存读取速度较快。

但很难有效的负载均衡,无法高效并行。

3.3 负载均衡+并行

通过Master节点,将请求分给对应的若干工作节点并行处理,再对结果进行合并和归纳,返回给客户端,实现高效并行处理。

延伸:数据运算的耗时,大都在查找、比较、排序、序列化、压缩、加密处理等,根据性能分析逐个调优。

4. 系统调优

4.1 GC

当内存越大时,二代回收耗费几秒甚至十几秒,会挂起所有线程而使节点在这段时间内不能正常工作。

1.可设置多核并发的Server GC模式,为每个核创建单独的大小堆和GC线程,减少回收的粒度和影响。

2.监控将要发生回收的工作节点,通知Mater并暂停该工作节点提供服务,直至GC完成。

4.2 Cache

1.运行时内存的增加,主要是因为创建了很多临时对象。所以,要尽量少用Linq,尽量避免创建不必要的对象。
2.频繁使用的字符串可尝试采用驻留机制。
3.将不常用的历史数据以文件方式存储和更新而不放入内存。
4.业务拆分减少每个节点要加载的数据。
5.尽量避免创建大对象,必要时通过弱引用+延迟加载处理大对象。

时间: 2024-10-12 01:22:39

计算密集型的相关文章

java 多线程学习笔记(一) -- 计算密集型任务

最近在看<Java虚拟机并发编程>,在此记录一些重要的东东. 线程数的确定:1. 获取系统可用的处理器核心数:int numOfCores = Runtime.getRuntime().availableProcessors()2. 如果任务是计算密集型的,则线程数 = numOfCores        如果任务是IO密集型的,则线程数 = numOfCores / (1 - 阻塞系数), 其中阻塞系数在0~1之间.注:如果任务被阻塞的时间大于执行时间, 则这些任务是IO密集型的,我们就需要

计算密集型分布式内存存储和运算平台架构

避嫌声明:所有图文都是根据自己的理解原创,且已离开这家公司三年以上,不存在保密协议,写此文只是用来分享知识.探究不足. 牢骚:本来想弄个ppt交互展示的,不过我的js权限还没批... 1. 相关概念 1.1 内存数据库 关系型数据库处理永久.稳定的数据,内存数据库就是将其数据放在内存中,活动事务只与内存数据打交道,重新设计了体系结构并且在数据缓存.快速算法.并行操作方面也进行了相应的改进,所以数据处理速度比磁盘数据库要快很多,一般都在10倍以上.但它不容易恢复,可能暂时不一致或非绝对正确的,要求

PU-bound(计算密集型) 和I/O bound(I/O密集型)

转载:https://blog.csdn.net/q_l_s/article/details/51538039 I/O密集型 (CPU-bound) I/O bound 指的是系统的CPU效能相对硬盘/内存的效能要好很多,此时,系统运作,大部分的状况是 CPU 在等 I/O (硬盘/内存) 的读/写,此时 CPU Loading 不高.CPU bound 指的是系统的 硬盘/内存 效能 相对 CPU 的效能 要好很多,此时,系统运作,大部分的状况是 CPU Loading 100%,CPU 要读

CPU-bound(计算密集型) 和I/O bound(I/O密集型)/数据密集型

https://blog.csdn.net/q_l_s/article/details/51538039 I/O密集型 (CPU-bound)I/O bound 指的是系统的CPU效能相对硬盘/内存的效能要好很多,此时,系统运作,大部分的状况是 CPU 在等 I/O (硬盘/内存) 的读/写,此时 CPU Loading 不高.CPU bound 指的是系统的 硬盘/内存 效能 相对 CPU 的效能 要好很多,此时,系统运作,大部分的状况是 CPU Loading 100%,CPU 要读/写 I

计算&amp;IO密集型任务的 优化

问题原因: 最近由于工作实际需求,需要对某个计算单元的计算方法进行重构.原因是由于这个计算单元的计算耗时较长,单个计算耗时大约在1s-2s之间,而新的需求下,要求在20s内对大约1500个计算单元计算完毕.如果不对原有计算单元的计算方法进行优化及效率提升,那么以8核CPU(超线程16线程)来说,在单个计算1s的理想条件,服务器16线程完成任务的理论上限也需要90s+,何况多线程还并不是简单的效率叠加,实际测试情况下,耗时往往在150s以上.因此,对原有计算单元的计算优化是必须的. 问题分析: 通

CPython在CPU密集型应用下的并发

Python是解释型语言,根据不同的底层协议有很多种版本,最常见的是基于C的Cpython,默认情况下我们所说的Python就是Cpython. Python的GIL(global interpreter lock): 用于解决多线程之间的数据完整性和状态同步而存在,使得不管线程分布在多少个CPU上,解释器同一时刻只允许1个线程运行. 所以Python是thread_safe的.这样其实Python就几乎只能进行单线程编程了. CPU密集型应用:(频繁计算) 从1开始累加,到1亿 1 def f

Hadoop的计算特征以及一般用在哪些业务场景?(转载)

其实我们要知道大数据的实质特性:针对增量中海量的结构化,非结构化,半结构数据,在这种情况下,如何快速反复计算挖掘出高效益的市场数据? 带着这个问题渗透到业务中去分析,就知道hadoop需要应用到什么业务场景了!!!如果关系型数据库都能应付的工作还需要hadoop吗? 比如 1.银行的信用卡业务,当你正在刷卡完一笔消费的那一瞬间,假如在你当天消费基础上再消费满某个额度,你就可以免费获得某种令你非常满意的利益等等,你可能就会心动再去消费,这样就可能提高银行信用卡业务,那么这个消费额度是如何从海量的业

数据密集型系统架构设计

按照使用的资源类型划分,我们可以把系统分为三大类型:IO密集型.计算密集型,数据密集型.系统的类型反映了系统的主要瓶颈.现实情况中,大部分系统在由小变大的过程中,最先出现瓶颈的是IO.IO问题体现在两个方面:高并发,存储介质的读写(例如数据库,磁盘等).随着业务逻辑的复杂化,接下来出现瓶颈的是计算,也就是常说的CPU idle不足.出现计算瓶颈的时候,一般会使用水平扩展(加机器)和垂直扩张(服务拆分)两个方法.随着数据量(用户数量,客户数量)的增长,再接下来出现瓶颈的是内存. 如今,内存的合理使

理工科应该的知道的C/C++数学计算库(转)

理工科应该的知道的C/C++数学计算库(转) 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分析...这些或多或少与我们常用的软件息息相关,假如有一天你只需要这些大型软件系统的某一个很有限的功能,你是不是也要因此再用一用那动辄几个g的软件呢?其实我觉得如果系统不是很大,不是很复杂,我们个人完全有可能自己去编写代码来实现这些‘’有限的功能‘’.别以为这是件很困难的事情,我总以为大学期间学的c语言是极其有用的,只要你会基本的c语言语法,你就可以的. 下面我来介绍几个非常