1. 程式人生 > >CPU io-密集型 計算密集型

CPU io-密集型 計算密集型

核心是可以分別獨立執行程式指令的計算單元。
執行緒是作業系統能夠進行運算排程的最小單位。

有一個原則是:活躍執行緒數為 CPU(核)數時最佳。過少的活躍執行緒導致 CPU 無法被充分利用,過多的活躍執行緒導致過大的執行緒上下文切換開銷。

執行緒應該是活躍的,處於 IO 的執行緒,休眠的執行緒等均不消耗 CPU。

在Java併發程式設計方面,計算密集型與IO密集型是兩個非常典型的例子,這次大象就來講講自己在這方面的內容,本篇比較基礎,只適合剛入門的童鞋,請各種牛人不喜勿噴。

    計算密集型
    計算密集型,顧名思義就是應用需要非常多的CPU計算資源,在多核CPU時代,我們要讓每一個CPU核心都參與計算,將CPU的效能充分利用起來,這樣才算是沒有浪費伺服器配置,如果在非常好的伺服器配置上還執行著單執行緒程式那將是多麼重大的浪費。對於計算密集型的應用,完全是靠CPU的核數來工作,所以為了讓它的優勢完全發揮出來,避免過多的執行緒上下文切換,比較理想方案是:
    執行緒數 = CPU核數+1
    也可以設定成CPU核數*2,這還是要看JDK的使用版本,以及CPU配置(伺服器的CPU有超執行緒)。對於JDK1.8來說,裡面增加了一個平行計算,計算密集型的較理想執行緒數 = CPU核心執行緒數*2

IO密集型
    對於IO密集型的應用,就很好理解了,我們現在做的開發大部分都是WEB應用,涉及到大量的網路傳輸,不僅如此,與資料庫,與快取間的互動也涉及到IO,一旦發生IO,執行緒就會處於等待狀態,當IO結束,資料準備好後,執行緒才會繼續執行。因此從這裡可以發現,對於IO密集型的應用,我們可以多設定一些執行緒池中執行緒的數量,這樣就能讓在等待IO的這段時間內,執行緒可以去做其它事,提高併發處理效率。
    那麼這個執行緒池的資料量是不是可以隨便設定呢?當然不是的,請一定要記得,執行緒上下文切換是有代價的。目前總結了一套公式,對於IO密集型應用:
    執行緒數 = CPU核心數/(1-阻塞係數)
    這個阻塞係數一般為0.8~0.9之間,也可以取0.8或者0.9。套用公式,對於雙核CPU來說,它比較理想的執行緒數就是20,當然這都不是絕對的,需要根據實際情況以及實際業務來調整。
    final int poolSize = (int)(cpuCore/(1-0.9))

根據任務所需要的cpu和io資源的量可以分為

  • CPU密集型任務:  主要是執行計算任務,響應時間很快,cpu一直在執行,這種任務cpu的利用率很高
  • IO密集型任務:主要是進行IO操作,執行IO操作的時間較長,這是cpu出於空閒狀態,導致cpu的利用率不高

為了合理最大限度的使用系統資源同時也要保證的程式的高效能,可以給CPU密集型任務和IO密集型任務配置一些執行緒數。

CPU密集型:執行緒個數為CPU核數。這幾個執行緒可以並行執行,不存線上程切換到開銷,提高了cpu的利用率的同時也減少了切換執行緒導致的效能損耗

IO密集型:執行緒個數為CPU核數的兩倍。到其中的執行緒在IO操作的時候,其他執行緒可以繼續用cpu,提高了cpu的利用率 。

有一個原則是:活躍執行緒數為 CPU(核)數時最佳。過少的活躍執行緒導致 CPU 無法被充分利用,過多的活躍執行緒導致過大的執行緒上下文切換開銷。

常見的服務執行緒模型

1、IO執行緒與工作現場通過任務佇列解耦 

   X:執行計算,佔用CPU時間

  Y:執行IO等待不佔用CPU時間 

  工作執行緒池的個數:N*(1+y/x)

2、純非同步

併發使用者數:是指現實系統中操作業務的使用者,在效能測試工具中,一般稱為虛擬使用者數(Virutal User)。

併發使用者數和註冊使用者數、線上使用者數的概念不同,

1、併發使用者數一定會對伺服器產生壓力的,

2、而線上使用者數只是 ”掛” 在系統上,對伺服器不產生壓力,

3、註冊使用者數一般指的是資料庫中存在的使用者數。

TPS:Transaction Per Second, 每秒事務數, 是衡量系統性能的一個非常重要的指標。

TPS就是每秒事務數,但是事務是基於虛擬使用者數的,假如1個虛擬使用者在1秒內完成1筆事務,那麼TPS明顯就是1;如果 某筆業務響應時間是1ms,那麼1個使用者在1秒內能完成1000筆事務,TPS就是1000了;如果某筆業務響應時間是1s,那麼1個使用者在1秒內只能完 成1筆事務,要想達到1000TPS,至少需要1000個使用者;因此可以說1個使用者可以產生1000TPS,1000個使用者也可以產生1000TPS,無非是看響應時間快慢。

也就是說,在評定伺服器的效能時,應該結合TPS和併發使用者數,以TPS為主,併發使用者數為輔來衡量系統的效能。如果必須要用併發使用者數來衡量的 話,需要一個前提,那就是交易在多長時間內完成,因為在系統負載不高的情況下,將思考時間(思考時間的值等於交易響應時間)加到指令碼中,併發使用者數基本可 以增加一倍,因此用併發使用者數來衡量系統的效能沒太大的意義。

在效能測試時並不需要用上萬的使用者併發去進行測試,如果只需要保證系統處理業務時間足夠快,幾百個使用者甚至幾十個使用者就可 以達到目的。據他了解,很多專家做過的效能測試專案基本都沒有超過5000使用者併發。因此對於大型系統、業務量非常高、硬體配置足夠多的情況下,5000 使用者併發就足夠了;對於中小型系統,1000使用者併發就足夠了。

系統吞吐量幾個重要引數:TPS、併發數、響應時間

     TPS:每秒鐘事務數量

     併發數: 系統同時處理的事務數

     響應時間:一般取平均響應時間

                TPS=併發使用者數 / (響應時間+Thinktime)

併發使用者如何計算

一、經典公式1:

   一般來說,利用以下經驗公式進行估算系統的平均併發使用者數和峰值資料

  1)平均併發使用者數為 C = nL/T

  2)併發使用者數峰值 C‘ = C + 3*根號C

    C是平均併發使用者數,n是login session的數量,L是login session的平均長度,T是值考察的時間長度

    C’是併發使用者數峰值

  舉例1,假設系統A,該系統有3000個使用者,平均每天大概有400個使用者要訪問該系統(可以從系統日誌從獲得),對於一個典型使用者來說,一天之內使用者從登陸到退出的平均時間為4小時,而在一天之內,使用者只有在8小時之內會使用該系統。

  那麼,

  平均併發使用者數為:C = 400*4/8 = 200

  併發使用者數峰值為:C‘ = 200 + 3*根號200 = 243

  舉例2, 某公司為其170000名員工設計了一個薪酬系統,員工可進入該系統查詢自己的薪酬資訊,但並不是每個人都會用這個系統,假設只有50%的人會定期用改系統,這些人裡面有70%是在每個月的最後一週使用一次該系統,且平均使用系統時間為5分鐘。

  則一個月最後一週的平均併發使用者數為(朝九晚五):

  n = 170000*0.5*0.7/5 = 11900

  C= 11900*5/60/8 = 124

  吞吐量計算為:F = Vu * R / T 單位為個/s

    F為事務吞吐量,Vu為虛擬使用者數個數,R為每個虛擬使用者發出的請求數,T為處理這些請求所花費的時間

二、通用公式2:

  對絕大多數場景,我們用(使用者總量/統計時間)*影響因子(一般為3)來進行估算併發量。

  比如,以乘坐地鐵為例子,每天乘坐人數為5萬人次,每天早高峰是7到9點,晚高峰是6到7點,根據8/2原則,80%的乘客會在高峰期間乘坐地鐵,則每秒到達地鐵檢票口的人數為50000*80%/(3*60*60)=3.7,約4人/S,考慮到安檢,入口關閉等因素,實際堆積在檢票口的人數肯定比這個要大,假定每個人需要3秒才能進站,那實際併發應為4人/s*3s=12,當然影響因子可以根據實際情況增大!

三、根據PV計算公式:

  比如一個網站,每天的PV大概1000w,根據2/8原則,我們可以認為這1000w pv的80%是在一天的9個小時內完成的(人的精力有限),那麼TPS為:

  1000w*80%/(9*3600)=246.92個/s,取經驗因子3,則併發量應為:

  246.92*3=740

四、根據TPS估計:

   公式為 C = (Think time + 1)*TPS

五、根據系統使用者數計算:

   併發使用者數 = 系統最大線上使用者數的8%到12%

相關推薦

CPU io-密集型 計算密集型

核心是可以分別獨立執行程式指令的計算單元。 執行緒是作業系統能夠進行運算排程的最小單位。 有一個原則是:活躍執行緒數為 CPU(核)數時最佳。過少的活躍執行緒導致 CPU 無法被充分利用,過多的活躍執行緒導致過大的執行緒上下文切換開銷。 執行緒應該是活躍的,處於 IO 的

Python進階之CPU計算密集型IO密集型

在最近往伺服器部署爬蟲程式的時候,遇到了一個很奇怪的問題,就是部署上之後執行一段時間或者是直接不執行就進入休眠狀態了,開始一直懷疑是由於伺服器記憶體不足導致的程式休眠,後來廢了好大的勁,最終找到了罪魁禍首,具體分析我通過這幾篇連載的部落格來分析一下,正好也對給自己充充電。 第一種任務的型別是

CPU-bound(計算密集型) 和 I/O bound(I/O密集型)

如果所有的任務都是計算(CPU)密集型的,則建立處理器可用核心數這麼多個執行緒就可以了,這樣已經充分利用了處理器,也就是讓它以最大火力不停進行計算。建立更多的執行緒對於程式效能反而是不利的,因為多個執行緒間頻繁進行上下文切換對於程式效能損耗較大。執行緒數=cpu核心數+1

計算密集型IO密集型、資料密集型

計算密集型(CPU-Intensive) 1、特點:要進行大量的計算,消耗CPU資源。比如計算圓周率、對視訊進行高清解碼等等,全靠CPU的運算能力。 2、計算密集型任務雖然也可以用多工完成,但是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低,所以,要最高效地利用CPU,計算密

IO密集型計算密集型、執行緒和程序

io密集型:有阻塞的狀態,就是一直會執行CPU(中間就一個等待狀態,這個就叫做IO密集型)。例如:sleep狀態 計算密集型任務:沒有等待的狀態就是計算密集型,從上到下執行沒有等待。 在Python中沒法同時使用多個CPU,在同一時刻,多個執行緒是互相搶佔資源的,在cpython執行中加了一把鎖(GIL)

系統技術非業餘研究 » 轉:CPU密集型計算 erlang和C 大比拼

原文地址:http://pseudelia.wordpress.com/2009/08/23/erlang-native-code-benchmark/ Normalerweise compiliert Erlang Bytecode (heißt das so in Erlang?). Das

[Python]IO密集型任務 VS 計算密集型任務

IO密集型任務 VS 計算密集型任務 所謂IO密集型任務,是指磁碟IO、網路IO佔主要的任務,計算量很小。比如請求網頁、讀寫檔案等。當然我們在Python中可以利用sleep達到IO密集型任務的目的。 所謂計算密集型任務,是指CPU計算佔主要的任務,CPU一直處於滿負荷狀態。比如在一個很大的列

計算密集型&IO密集型

原文:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001397567993007df355a3394da48f0bf14960f0c78753f000

CPU-bound(計算密集型) 和I/O bound(I/O密集型)

I/O密集型 (CPU-bound) I/O bound 指的是系統的CPU效能相對硬碟/記憶體的效能要好很多,此時,系統運作,大部分的狀況是 CPU 在等 I/O (硬碟/記憶體) 的讀/寫,此時 CPU Loading 不高。 CPU bound 指的是系統的 硬碟/記憶體 效能 相對 CPU 的效能

Python筆記-計算密集型(最好用C)、IO密集型(最好用指令碼)

計算密集型 1、特點:要進行大量的計算,消耗CPU資源。比如計算圓周率、對視訊進行高清解碼等等,全靠CPU的運算能力。 2、計算密集型任務雖然也可以用多工完成,但是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低,所以,要最高效地利用CPU,計

執行緒與程序 計算密集型 IO密集型

執行緒與程序:   執行緒和程序通常都有一個主線/程序的負責分配任務和其他子線/程序負責執行任何。   多程序的優點在於一個子程序掛了,不會影響其他程序(主程序掛了就全掛了),但是其建立的代價較大,Apache採用的就是多程序機制;   而多執行緒一般要比

計算密集型IO密集型

計算密集型 計算密集型任務的特點是要進行大量的計算,消耗CPU資源,比如計算圓周率、對視訊進行高清解碼等等,全靠CPU的運算能力。這種計算密集型任務雖然也可以用多工完成,但是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低,所以,要最高效地利用CPU,計算密集

為什麼PHP不適合計算密集型業務

回答這個問題,我們來了解一下為什麼說PHP慢? PHP的慢是相對於C/C++級別的語言來說,事實上,PHP語言最初的設計,就不是用來解決計算密集型的應用場景。我們可以這樣粗略理解為,PHP為了提升開發效率,而犧牲了執行效率。 我們知道PHP一個很大的特點,就是弱型別特性,也就是說,我可以隨意定義一個變數,然

現已推出 – Amazon EC2 的計算密集型 C5 例項

我很高興地宣佈,新的計算密集型 C5 例項今天在三個 AWS 區域推出,有六種大小規格! 這些例項專用於計算密集型應用程式,例如批處理、分散式分析、高效能運算 (HPC)、廣告服務、高度可擴充套件的多人遊戲和視訊編碼。新例項提供了比 C4 例項高 25% 的價格/效能改進,對

並行流計算--統計1-n的和,計算密集型

import java.util.function.Function; import java.util.stream.LongStream; import java.util.stream.Stream; public class ParalleStreamDemo {

python計算密集型任務多程序最佳使用的核數

import time from multiprocessing import Pool from tqdm import tqdm import pandas as pd import matplotlib.pyplot as plt def run(i): cou

高效能運算和資料密集型計算的儲存需要差異分析

根據應用領域的不同,目前主流的分散式並行檔案系統可分為2類:面向高效能運算(HPC:High Performance Computing)應用的並行檔案系統,典型代表如Luster、Panasas和PVFS;面向資料密集型計算(DISC: Data Intensive S

Zabbix通過SNMP監控多核CPU使用率時, 計算CPU平均使用率

mes ces zabb ext 觸發器 trend times http sso 環境:沒有Agent,只能通過SNMP監控時,需要獲取多核CPU的平均使用率。 ZABBIX的使用SNMP監控CPU使用率時,由於設備都是多核CPU,監控的都是單獨某一核心的使用率,但單獨某

SylixOS中CPU性能計算

sylixos cpu性能計算1、概述本篇主要介紹SylixOS中CPU性能計算方法。2、簡介BogoMips是SylixOS中衡量CPU運行速度的一種標準,但只能用來粗略計算CPU的性能,並不十分精確。SylixOS中關於CPU性能計算的方法位於內核文件"libsylixos/SylixOS/kernel/

OpenCL的多GPU和多核CPU異構計算--1

原作者:飛鴻驚雪 地址點選開啟連結 本文主要探究OpenCL的GPU和多核CPU的異構計算問題,主要簡要闡述了什麼是OpenCL異構計算,講述CPU和GPU各自的特點,並且把他們結合起來做異構計算的前景。然後具體講述在高效能實驗室Linux工作站上如何搭建多GPU和多核