一个 Java 项目,用来处理大批量的任务数据,并且希望其部署到服务器上后,能充分利用服务器资源,即能够动态的根据 Linux 的剩余资源状态调控自己的任务数量,如何实现?跑的任务越多消耗的资源越多对吧,那怎么去调控呢?不控制的话会崩吧?或者大家说说平时是如何让项目充分的利用服务器资源的?
1
malusama 2019-12-25 21:28:01 +08:00
都跑满不行么。。
|
2
ClericPy 2019-12-25 21:33:09 +08:00
好眼熟... 以前公司里 scala 就是先把内存全占上(64GB 占了 62...) 一大堆 Actor 动态调整的...
不过不会 scala 和 java, 溜走... |
3
crclz 2019-12-25 23:35:23 +08:00
CPU 密集型的任务不知道,估计开 1 个 2 个 3 个一直到 CPU 跑满就能确定开多少个数量。
如果是 IO 密集型的,如果瓶颈在数据量,那就`并发任务数 = CPU 核心数(不算超线程) * 2 + 硬盘主轴数量`。注意一次性处理的任务数量( batch size )别太大。 |
4
crclz 2019-12-25 23:35:57 +08:00
更正:瓶颈在数据量 -> 库
|
5
haishiwuyuehao 2019-12-26 01:17:27 +08:00
大批量任务数据。这里的“任务”具体指什么?
跑的任务越多资源的消耗越多。希望通过“消耗更多的资源” 换取更多的“任务”处理速度? 服务器资源。具体有什么?几核?可用内存是多少?支持其它程序吗,还是只支持 java ? 楼主的意思大概是这样(假设是 java 爬虫项目)?有个 Java 爬虫项目。用多线程爬取网页读取数据,写入到数据库,希望部署到线上能够充分利用线上资源( 8 核 16G,阿里云 ESC 实例 100%),请问怎么根据 linux CPU,内存,进行最大化利用来爬取。有 1TB 数据需要入库,需要在 10 天内完成,这个任务需要怎么配置更合理 楼主说的不够清晰,如果可以用上面的话语描述一下,如果是上面的场景我能提供一些些经验。 |
6
Aliberter OP @haishiwuyuehao 好的,谢谢大佬提醒,我说清楚一点。就是这是一个中间业务的系统,每天要从 A 项目获取大批量的文件,批量解析到数据库,然后做数据的验证过滤补录等一系列操作,然后拿着操作完的数据去发给 B 项目,获取 B 项目结果以后再将结果返回给 A 项目。我们将一个批次的处理过程称为一个“任务”。现在的问题是我们如何考虑控制任务的数量,在线上系统中,应该不能无限制的给它增加任务吧。从如何充分利分服务器资源可以引申为如何让这个系统变得高效,稳定,尽可能多的处理任务,项目设计层面有什么好的思路。
|
8
Itoktsnhc 2019-12-26 10:22:42 +08:00
先要能够监控机器的指标。手动调整就是人看一眼各个指标,调一下并发任务数,再看一眼这种。自动反馈的话,就是用程序来做这个事情,首先需要执行任务的程序能够定期(例如 5min )读取远端配置,并按照配置调整数量,另外的控制端读取机器指标,观察是否在设置的指标上限之下(比如 CPU < 80%,MEM<90%这种),在指标下,则增加任务数量;超过了,就减少。这样大体上能维持各个指标在你设置的限制上下波动。
|
9
haishiwuyuehao 2019-12-26 14:09:15 +08:00 via iPhone
@Aliberter 你说的还是有点....
我给个思路试试。开启 N 个线程,每个线程分一批文件读取,写入到数据库。结果也写入到数据库。所有文件处理完成再从数据库读取结果返回给系统 a。 |
10
luvroot 2019-12-26 16:02:25 +08:00
大佬们,想让项目充分的利用服务器资源,如何实现?
很简单,卖 docker 实例。或则做成 serverless。前提是长期 90%cpu 使用率,看看会不会被封。 |
11
hzgit 2019-12-26 21:07:15 +08:00
任务队列,削峰填谷
推拉结合,量入为出 |