導航:首頁 > 源碼編譯 > cpu密集任務編譯

cpu密集任務編譯

發布時間:2022-07-08 04:16:49

『壹』 如何識別SQL Server中的CPU瓶頸

問題:
如果經常遇到CPU瓶頸而導致的SQLServer宕機,那如何去發現並解決這些相關的問題?

解決方案:
導致CPU成為SQLServer性能問題的原因有很多,比較明顯的原因是因為資源不足。但是,CPU的利用率可以通過配置的更改和查詢的優化來降低,所以當你想買更快更好的處理器之前,先要考慮前面的操作。下面是使用一些內置工具來識別CPU相關瓶頸:

性能監視器(Performance Monitor):
可以使用性能監視器來檢查CPU的負載。檢查Processor:% Processor Time 這個計數器:如果長期超過80%/處理器,那很有可能面臨了CPU相關瓶頸。

CPU密集操作主要是編譯和重編譯。你可以通過使用SQL Statistics對象計數器來監視它們的情況。也可以監控批處理接收的數量來查看。如果SQL Recompilations/sec 中的BatchRequests/sec的速率很高,那就有潛在的問題:
配置和監視以下計數器:
SQL Server: SQL Statistics: SQL Compilations/sec
SQL Server: SQL Statistics: SQL Recompilations/sec
SQL Server: SQL Statistics: Batch Requests/sec
可以從MSDN中獲取關於這部分的詳細信息: MSDN Library.

另外一個用於探測CPU相關問題的計數器是:SQL Server: Cursor Manager By Type – CursorRequests/Sec ,用於顯示你的伺服器上游標使用情況。如果你看到每秒有數以百計的游標請求,那很有可能是因為低效的游標使用和小體積提取操作(small fetch size)引起性能問題。

內部並行查詢同樣會引起CPU問題,可以檢查:
SQL Statistics:Batch Requests/sec counter 計數器。在CPU生命周期中,每秒的批處理應該很小。如果過多,意味著正在使用並行計劃運行。

動態管理視圖(DMVs):
以下是對排查CPU瓶頸游泳的DMVs。動態視圖:sys.dm_exec_query_stats顯示目前緩存的批處理或者使用CPU的過程。下面的查詢用於檢查耗費CPU的執行計劃:
select plan_handle,
sum(total_worker_time) as total_worker_time,
sum(execution_count) as total_execution_count,
count(*) as number_of_statements
from sys.dm_exec_query_stats
group by plan_handle
order bysum(total_worker_time), sum(execution_count) desc

SQLServer2008在每個查詢編譯時,會計算其hash值。你可以在query_hash列中找到該值,是否兩個查詢僅僅字面值不同但是使用相同query_hash值。該值也在 Showplan/Statistics XML QueryHash屬性中可以查看。
Plan_generation_num列顯示一個查詢被重編譯的次數。
SQLServer優化器嘗試選擇能提供最快響應時間的執行計劃,但是不代表總是低CPU利用。低效的查詢計劃會引起CPU的好用,此時同樣可以使用sys.dm_exec_query_stats 來監控。
如果你想有一個對SQLServer優化所耗費時間的總覽,可以檢查:
sys.dm_exec_query_optimizer_info 。其中的消耗時間和最後開銷會非常有用。
可以使用以下DMVs來查詢內部並行查詢及其查詢文本、執行計劃的情況:
sys.dm_exec_cached_plan: Shows the cached query plans.
sys.dm_exec_requests: Shows each executing request in the SQL Server instance.
sys.dm_exec_sessions: Shows all active user connections and internal tasks.
sys.dm_exec_sql_text: Shows the text of the SQL batches.
sys.dm_os_tasks: Shows each active task within SQL Server.

SQL Server Profiler:
如果性能監視器發現有問題,同樣可以使用SQLServer Profiler來發現不必要的編譯和重編譯。SQLServer Profiler 跟蹤能幫助你找到一直重編譯的存儲過程。可以使用下面的事件:
SP:Recompile, CursorRecompile, SQL:StmtRecompile: 這個事件是針對SQLServer的重編譯。SP:Recompile事件中的EventSubClass 說明了重編譯的原因。
· Showplan XML For Query Compile: 這個事件是針對T-SQL語句的重編譯。包含了查詢計劃和過程的對象ID.注意對這個事件運行一個跟蹤,能得到利用系統資源的重要信息。但是,如果性能計數器報告SQL Compilations/sec 的值很高時,跟蹤將非常好資源。
低效的游標可以使用RPC:Completed事件來跟蹤。查看sp_cursorfetch語句並檢查第四個參數,包含每次提前(fetch)包含的行數。

『貳』 為什麼nodejs 不適合cpu 密集型任務

我並沒有嘗試過用Node去CPU密集計算,所以不亂作評價。
猜測大概是2點:
1.Node還沒有簡單易用的多核計算介面。Cluster並不是那麼好用。
2.Node的單核效率雖然比傳統腳本語言高,但是和C,C++,Java比並沒有優勢。

『叄』 Adobe Audition CC打開效果器,提示CPU密集行運算,然後不能實時調整效果

這些效果是不行的、因為插件不是VST的。不能實時渲染出來的。

你可以進入單軌裡面的 調整好參數。渲染好。再聽的

『肆』 android系統編譯能用分布式編譯嗎

項目越來越大,每次需要重新編譯整個項目都是一件很浪費時間的事情。Research了一下,找到以下可以幫助提高速度的方法,總結一下。
1. 使用tmpfs來代替部分IO讀寫
2.ccache,可以將ccache的緩存文件設置在tmpfs上,但是這樣的話,每次開機後,ccache的緩存文件會丟失
3.distcc,多機器編譯
4.將屏幕輸出列印到內存文件或者/dev/null中,避免終端設備(慢速設備)拖慢速度。

tmpfs
有人說在Windows下用了RAMDisk把一個項目編譯時間從4.5小時減少到了5分鍾,也許這個數字是有點誇張了,不過粗想想,把文件放到內存上做編譯應該是比在磁碟上快多了吧,尤其如果編譯器需要生成很多臨時文件的話。
這個做法的實現成本最低,在Linux中,直接mount一個tmpfs就可以了。而且對所編譯的工程沒有任何要求,也不用改動編譯環境。
mount -t tmpfs tmpfs ~/build -o size=1G
用2.6.32.2的Linux Kernel來測試一下編譯速度:
用物理磁碟:40分16秒
用tmpfs:39分56秒
呃……沒什麼變化。看來編譯慢很大程度上瓶頸並不在IO上面。但對於一個實際項目來說,編譯過程中可能還會有打包等IO密集的操作,所以只要可能,用tmpfs是有益無害的。當然對於大項目來說,你需要有足夠的內存才能負擔得起這個tmpfs的開銷。
make -j
既然IO不是瓶頸,那CPU就應該是一個影響編譯速度的重要因素了。
用make -j帶一個參數,可以把項目在進行並行編譯,比如在一台雙核的機器上,完全可以用make -j4,讓make最多允許4個編譯命令同時執行,這樣可以更有效的利用CPU資源。
還是用Kernel來測試:
用make: 40分16秒
用make -j4:23分16秒
用make -j8:22分59秒
由此看來,在多核CPU上,適當的進行並行編譯還是可以明顯提高編譯速度的。但並行的任務不宜太多,一般是以CPU的核心數目的兩倍為宜。
不過這個方案不是完全沒有cost的,如果項目的Makefile不規范,沒有正確的設置好依賴關系,並行編譯的結果就是編譯不能正常進行。如果依賴關系設置過於保守,則可能本身編譯的可並行度就下降了,也不能取得最佳的效果。
ccache
ccache工作原理:
ccache也是一個編譯器驅動器。第一趟編譯時ccache緩存了GCC的「-E」輸出、編譯選項以及.o文件到$HOME/.ccache。第二次編譯時盡量利用緩存,必要時更新緩存。所以即使"make clean; make"也能從中獲得好處。ccache是經過仔細編寫的,確保了與直接使用GCC獲得完全相同的輸出。

ccache用於把編譯的中間結果進行緩存,以便在再次編譯的時候可以節省時間。這對於玩Kernel來說實在是再好不過了,因為經常需要修改一些Kernel的代碼,然後再重新編譯,而這兩次編譯大部分東西可能都沒有發生變化。對於平時開發項目來說,也是一樣。為什麼不是直接用make所支持的增量編譯呢?還是因為現實中,因為Makefile的不規范,很可能這種「聰明」的方案根本不能正常工作,只有每次make clean再make才行。
安裝完ccache後,可以在/usr/local/bin下建立gcc,g++,c++,cc的symbolic link,鏈到/usr/bin/ccache上。總之確認系統在調用gcc等命令時會調用到ccache就可以了(通常情況下/usr/local /bin會在PATH中排在/usr/bin前面)。
安裝的另外一種方法:
vi ~/.bash_profile
把/usr/lib/ccache/bin路徑加到PATH下
PATH=/usr/lib/ccache/bin:$PATH:$HOME/bin
這樣每次啟動g++的時候都會啟動/usr/lib/ccache/bin/g++,而不會啟動/usr/bin/g++
效果跟使用命令行ccache g++效果一樣
這樣每次用戶登錄時,使用g++編譯器時會自動啟動ccache
繼續測試:
用ccache的第一次編譯(make -j4):23分38秒
用ccache的第二次編譯(make -j4):8分48秒
用ccache的第三次編譯(修改若干配置,make -j4):23分48秒

看來修改配置(我改了CPU類型...)對ccache的影響是很大的,因為基本頭文件發生變化後,就導致所有緩存數據都無效了,必須重頭來做。但如果只是修改一些.c文件的代碼,ccache的效果還是相當明顯的。而且使用ccache對項目沒有特別的依賴,布署成本很低,這在日常工作中很實用。
可以用ccache -s來查看cache的使用和命中情況:
cache directory /home/lifanxi/.ccachecache hit 7165cache miss 14283called for link 71not a C/C++ file 120no input file 3045files in cache 28566cache size 81.7 Mbytesmax cache size 976.6 Mbytes
可以看到,顯然只有第二編次譯時cache命中了,cache miss是第一次和第三次編譯帶來的。兩次cache佔用了81.7M的磁碟,還是完全可以接受的。
distcc
一台機器的能力有限,可以聯合多台電腦一起來編譯。這在公司的日常開發中也是可行的,因為可能每個開發人員都有自己的開發編譯環境,它們的編譯器版本一般是一致的,公司的網路也通常具有較好的性能。這時就是distcc大顯身手的時候了。
使用distcc,並不像想像中那樣要求每台電腦都具有完全一致的環境,它只要求源代碼可以用make -j並行編譯,並且參與分布式編譯的電腦系統中具有相同的編譯器。因為它的原理只是把預處理好的源文件分發到多台計算機上,預處理、編譯後的目標文件的鏈接和其它除編譯以外的工作仍然是在發起編譯的主控電腦上完成,所以只要求發起編譯的那台機器具備一套完整的編譯環境就可以了。
distcc安裝後,可以啟動一下它的服務:
/usr/bin/distccd --daemon --allow 10.64.0.0/16
默認的3632埠允許來自同一個網路的distcc連接。
然後設置一下DISTCC_HOSTS環境變數,設置可以參與編譯的機器列表。通常localhost也參與編譯,但如果可以參與編譯的機器很多,則可以把localhost從這個列表中去掉,這樣本機就完全只是進行預處理、分發和鏈接了,編譯都在別的機器上完成。因為機器很多時,localhost的處理負擔很重,所以它就不再「兼職」編譯了。
export DISTCC_HOSTS="localhost 10.64.25.1 10.64.25.2 10.64.25.3"
然後與ccache類似把g++,gcc等常用的命令鏈接到/usr/bin/distcc上就可以了。
在make的時候,也必須用-j參數,一般是參數可以用所有參用編譯的計算機CPU內核總數的兩倍做為並行的任務數。
同樣測試一下:
一台雙核計算機,make -j4:23分16秒
兩台雙核計算機,make -j4:16分40秒
兩台雙核計算機,make -j8:15分49秒
跟最開始用一台雙核時的23分鍾相比,還是快了不少的。如果有更多的計算機加入,也可以得到更好的效果。
在編譯過程中可以用distccmon-text來查看編譯任務的分配情況。distcc也可以與ccache同時使用,通過設置一個環境變數就可以做到,非常方便。
總結一下:
tmpfs: 解決IO瓶頸,充分利用本機內存資源
make -j: 充分利用本機計算資源
distcc: 利用多台計算機資源
ccache: 減少重復編譯相同代碼的時間
這些工具的好處都在於布署的成本相對較低,綜合利用這些工具,就可以輕輕鬆鬆的節省相當可觀的時間。上面介紹的都是這些工具最基本的用法,更多的用法可以參考它們各自的man page。
5.還有提速方法是把屏幕輸出重定向到內存文件或/dev/null,因對終端設備(慢速設備)的阻塞寫操作也會拖慢速度。推薦內存文件,這樣發生錯誤時,能夠查看。

『伍』 如何優化一個cpu運算密集型網站

有以下幾種辦法可以提高CPU性能:
1,在任務管理器里關閉沒用的程序。
2,通過超頻來使得CPU頻率達到更高,使得性能更強。
3,清理系統垃圾,提高系統速度,使得CPU性能更完全發揮。

『陸』 python判斷任務是CPU密集型還是IO密集型

目前已經知道,在需要並發執行任務的時候,需要使用多線程或者多進程;如果是IO密集型任務,使用多線程,如果是CPU密集型任務,使用多進程;但問題是,經常我們會遇到一種情況就是:需要被執行的任務既有IO操作,又有計算操作,那麼這種情況下,已經無法 直觀的判斷任務是IO操作的多還是計算操作的多了;
所以,在開始並發任務之前,可以先進行測試,看看是使用多線程還是多進程所用的時間少,那個少就用那個

『柒』 單進程線之下,cpu密集型業務怎麼控制線程數量

線程:程序運行流的最小單元,一個程序是有一個或多個線程組成。作用:cpu線程越多,程序運行越快,或者可以同時運行的程序越多。換句話說,cpu線程越多電腦越不容易卡。同時,CPU支持的線程數越多,說明它的性能越強。

『捌』 io密集和cpu密集兩種情況下,線程池裡的線程數應該怎麼設置

普通線程Start之後就運行了。線程池的需要調度一下,可能算慢一點吧。 當線程很多時,獨立線程比線程池也要好點,因為線程池有大小的,在搶奪處理器資源上不是最有利的。但是通常情況下,二者沒有太大差別。 一個短期任務就用線程池,一個守護或長期工作線程就用獨立線程。
線程池任務一般都是迅速完成並且逗直線前進地的,也就是不需要等待事件,不需要等待時間,只是直線條的完成一個任務,然後就over。這樣的就適合放入線程池。 個人感覺: 如果系統資源不是非常緊缺,最好用線程,不要用線程池,反正感覺線程池有時會出點問題。

『玖』 用C語言編寫一個死循環能讓CPU使用率一直保持100%嗎

如果在單任務系統中運行,可以用C語言編寫一個死循環,讓CPU使用率一直保持在100%。

例如:while(true);
(註:DOS 就是單任務操作系統)

如果在多任務系統中運行,則不可能只通過一個死循環就讓CPU使用率一直保持在100%。
除了死循環,你還要讓你的程序獲得最高的優先順序。
如果是多處理器環境,你還要啟用多個線程來佔用每個處理器。
(註:Windows 就是多任務操作系統)

閱讀全文

與cpu密集任務編譯相關的資料

熱點內容
噴油螺桿製冷壓縮機 瀏覽:579
python員工信息登記表 瀏覽:377
高中美術pdf 瀏覽:161
java實現排列 瀏覽:513
javavector的用法 瀏覽:982
osi實現加密的三層 瀏覽:233
大眾寶來原廠中控如何安裝app 瀏覽:916
linux內核根文件系統 瀏覽:243
3d的命令面板不見了 瀏覽:526
武漢理工大學伺服器ip地址 瀏覽:149
亞馬遜雲伺服器登錄 瀏覽:525
安卓手機如何進行文件處理 瀏覽:71
mysql執行系統命令 瀏覽:930
php支持curlhttps 瀏覽:143
新預演算法責任 瀏覽:444
伺服器如何處理5萬人同時在線 瀏覽:251
哈夫曼編碼數據壓縮 瀏覽:426
鎖定伺服器是什麼意思 瀏覽:385
場景檢測演算法 瀏覽:617
解壓手機軟體觸屏 瀏覽:350