我需要多少個線程?

這取決于您的應用程序。 但是對于那些希望對如何從生產站點購買的所有昂貴內核中擠出更多資金的人來說,請多多包涵,我將闡明圍繞多線程 Java應用程序的奧秘。

內容針對最典型的Java EE應用程序進行了“優化”,該應用程序具有Web前端,允許最終用戶在應用程序內發起許多小交易。 每個交易的重要部分都在等待一些外部資源。 例如從數據庫或任何其他集成數據源返回的查詢。 但是大多數內容也與其他應用程序相關。 例如繁重的計算建模應用程序或處理數據的批處理過程。 Multithreading

但是,讓我們從基礎開始。 在我們描述的應用程序類型中,您傾向于有很多用戶與您的應用程序進行交互。 是成千上萬同時活動的用戶還是成千上萬的用戶-所有這些用戶都希望應用程序及時響應他們。 這就是您對操作系統設計人員感激的地方。 那些家伙在所有人甚至還沒有想到HTTP協議之前就已經想出了這種解決方法。

在您在軟件中創建更多線程然后基礎硬件可以同時執行的情況下,使用的解決方案很有用。 在硬件級別上,您還具有線程。 例如您CPU上的內核或具有超線程功能的虛擬化環境(如Intel)。 無論如何,我們手頭的應用程序可以輕易產生比基礎硬件直接支持更多的軟件線程。 您的OS現在啟動的功能類似于簡單的循環調度。 在此期間,每個軟件線程輪流執行,稱為時間片,以在實際硬件上運行。

時間分片允許所有線程進行。 否則,很容易想象這樣一種情況,其中一個用戶發起了一項真正昂貴的任務,而為其他用戶提供服務的所有其他線程卻挨餓了。

因此,我們正在經歷這個驚人的時間切片。 那么將線程數設置為LARGE_NUMBER并完成該操作是否可行? 顯然沒有。 其中包括間接費用,實際上甚至包括幾種間接費用。 因此,為了在調整線程時做出明智的決定,讓我們介紹一下由LARGE_NUMBER個線程一一導致的問題。

注冊狀態保存/恢復 。 處理器寄存器確實包含很多狀態。 每次計劃程序移至下一個任務時,哪個文件都會保存到緩存中。 然后在時間到來時恢復。 幸運的是,調度程序分配的時間片相對較大。 因此,在多線程環境中,來往于注冊表的保存/還原開銷通常不會成為我們最卑鄙的敵人。

。 當時間片被鎖持有線程占用時,所有其他等待此特定鎖的線程現在都必須等待。 直到鎖持有者獲得另一片和釋放鎖的機會。 因此,如果您正在進行大量同步,則請檢查線程在高負載下的行為。 由于鎖持有線程,您的同步代碼有可能導致發生更多上下文切換。 分析線程轉儲將是開始調查此危險的好地方。

釋放虛擬內存 。 所有操作系統都利用交換到外部存儲的虛擬內存。 通過在需要時將內存中的最近最少使用(LRU)數據交換到磁盤驅動器。 哪個好 但是,如果您現在正在使用有限的內存運行應用程序,并且有許多線程在爭奪將其堆棧和私有數據放入內存的空間,那么您可能會遇到問題。

在每個時間片回合中,您可能都有線程在外部存儲中交換數據。 這將大大降低應用程序的性能。 特別是對于問題特別嚴重的Java應用程序。 每當您開始交換堆時,每次Full GC運行都將花費很長時間。 一些專家建議關閉操作系統級別的交換功能。 在Linux發行版中,您可以通過swapoff –a來實現。

但好消息是,過去幾年該問題已大大減少。 兩者均具有廣泛的64位OS部署,從而可以使用更大的RAM和SSD來代替世界各地的傳統旋轉磁盤。 但是要注意敵人,如果有疑問,請檢查進程的頁面進/出比例。

最后但并非最不重要的- 線程緩存狀態 。 在所有現代處理器中,您都在內核旁邊建立了高速緩存,從而使操作完成速度比RAM中的數據快100倍。 絕對很棒。 但是不妙的是,當線程開始為這個極其有限的空間而戰時。 然后,負責清理的LRU算法再次開始清理緩存,為新數據騰出空間。 這可能是其時間片中輸入緩存的數據最后一個線程。 因此,您的線程最終可能會從緩存中清除彼此的數據。 再次造成了嚴重的問題。

如果您在Intel體系結構上運行,那么在這種情況下可能會幫助您的解決方案是Intel的VTune Performance Analyzer

因此,也許將LARGE_NUMBER個線程放入應用程序配置中并不是最明智的選擇。 但是在配置線程數時會給出什么提示?

首先,可以將某些應用程序配置為以等于基礎硬件線程的線程數運行。 對于典型的Web應用程序可能不是這種情況,但是肯定有很好的案例支持此策略。 請注意,當您的線程在諸如關系數據庫之類的外部資源后面等待時,這些線程將從循環調度中刪除。 因此,在典型的Java EE應用程序中,擁有比基礎硬件更多的線程并且仍在無鎖爭用或其他問題的情況下運行并不罕見。

接下來,明智的做法是將線程劃分為不同用途的不同組。 典型的情況是將計算線程與I / O線程分開。 計算線程通常在大多數時間都處于繁忙狀態,因此將其數量保持在底層硬件容量以下非常重要。 另一方面,I / O線程(例如需要數據庫往返的操作)在大多數時間里都在等待。 因此,不會過于頻繁地為爭取資源做出貢獻。 因此,使I / O線程(方式)的數量大于支持您的應用程序的硬件線程的數量是安全的。

然后,您應該最小化線程的創建和銷毀。 由于這些操作往往很昂貴,因此請查看合并解決方案。 您可能正在使用已經內置了線程池的Java EE基礎結構,或者可以查看java.util.concurrent.ThreadPoolExecutor之類的解決方案。 但是,當您有時需要增加或減少線程數時,也不要太害羞–只需避免在與下一個HTTP請求或JDBC連接一樣可預測的事件上創建和刪除它們。

作為最后的建議,我們將提供最重要的建議。 測量。 調整線程池的大小,并在負載下運行應用程序。 測量吞吐量和延遲。 然后進行優化以實現您的目標。 然后再次測量。 沖洗并重復。 直到您對結果滿意為止。

不要對CPU的性能做任何假設。 如今,CPU中發生的魔力數量巨大。 還要注意,虛擬化和JIT運行時優化也會增加額外的復雜性。 但是這些將成為另一個話題。 如果您訂閱我們的Twitter feed ,將會及時收到通知。

在撰寫本文時,以下資源被用作靈感來源:

  • Arch Robinson的帖子,關于多少線程會影響性能
  • 不同的Stackoverflow問題和評論:
    • http://stackoverflow.com/questions/130506/how-many-threads-should-i-use-in-my-java-program

是的。 本文是有關我們在內存泄漏以外其他問題領域進行研究的第一條提示。 但是我們尚無法預測是否以及何時要為所有鎖定和緩存爭用問題提供解決方案。 但是絕對有希望。

參考: 我需要多少個線程? 由我們的JCG合作伙伴 Nikita Salnikov Tarnovski在Plumbr Blog博客上獲得。

翻譯自: https://www.javacodegeeks.com/2013/01/how-many-threads-do-i-need.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370272.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370272.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370272.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

H5網頁適配 iPhoneX,就是這么簡單

iPhoneX 取消了物理按鍵,改成底部小黑條,這一改動導致網頁出現了比較尷尬的屏幕適配問題。對于網頁而言,頂部(劉海部位)的適配問題瀏覽器已經做了處理,所以我們只需要關注底部與小黑條的適配問題即可&#…

python為什么closed_為什么python類的函數被調用兩次[關閉](Why a function of python class is called twice [closed])...

為什么python類的函數被調用兩次[關閉](Why a function of python class is called twice [closed])我遇到了兩次調用的python類函數的問題。 我正在使用Spyder IDE。這是我的簡單代碼class Test:def f(self):print("a")from Test import *t Test()t.f()當我按“運行…

php關聯數組和哈希表,php遍歷哈希表及關聯數組的實例代碼

有關php數組的分類,PHP數組分為:數字索引數組和關聯數組。其中數字索引數組和C語言中的數組一樣,下標是為0,1,2…而關聯數組下標可能是任意類型,與其它語言中的hash,map等結構相似。PHP遍歷關聯…

數字校園-云資源平臺 2014.10.26-人人通共享空間

近期,教育部在統計學校信息化建設情況,當中一項重要內容,作為三通兩平臺的一個環節,就是學校開通人人通空間的情況,網上普及了一下知識,不就是十多年前就玩的學校博客的變種嗎,網上有一些產品,也是沒有熱鬧起來,為要求而要求的多,既然要求,就來一個吧,花了幾天時間,也做了一個.…

VUE.js 中取得后臺原生HTML字符串 原樣顯示問題

今天使用vue調試頁面,發現了頁面上的一個問題,后臺數據傳過來的HTML字符串并沒有被轉換為正常的HTML代碼,一拍腦門,發現忘記轉換了,于是滿心歡喜加上了{{{}}}。但是之后構建發現報錯: 為此去官網上查了下…

高性能持久消息

總覽 盡管有許多可用于Java的高性能消息傳遞系統,但大多數都避免引用基準,包括持久消息傳遞和消息的序列化/反序列化。 這樣做有很多原因。 1)您并不總是需要或想要持久消息2)您希望使用自己的序列化選項。 避免使用它們的一個重要…

python去掉重復內容并按原來次序輸出元素_在Python中,從列表中刪除重復項以使所有元素在保留順序時都是唯一的最快的算法是什么?...

飲歌長嘯使用方法:lst [8, 8, 9, 9, 7, 15, 15, 2, 20, 13, 2, 24, 6, 11, 7, 12, 4, 10, 18, 13, 23, 11, 3, 11, 12, 10, 4, 5, 4, 22, 6, 3, 19, 14, 21, 11, 1, 5, 14, 8, 0, 1, 16, 5, 10, 13, 17, 1, 16, 17, 12, 6, 10, 0, 3, 9, 9, 3, 7, 7, 6, 6, 7, 5, 1…

Lucene –快速添加索引和搜索功能

什么是Lucene? Apache LuceneTM是完全用Java編寫的高性能,功能齊全的文本搜索引擎庫。 它是一項適用于幾乎所有需要全文搜索的應用程序的技術,尤其是跨平臺的應用程序。 Lucene可以純文本,整數,索引PDF,Of…

td 雙擊 編輯 php,雙擊表格td進行編輯

$(function(){//隔行換色// $("tbody tr:odd").css("background-color","#eee");var numId $(".tbody td");numId.dblclick(function(){var tdIns $(this);var tdpar $(this).parents("tr");//tdpar.remove();//current_…

前端開發之基礎知識-HTML(一)

1.1 html概述和基本結構 html概述 HTML是 HyperText Mark-up Language 的首字母簡寫,意思是超文本標記語言,超文本指的是超鏈接,標記指的是標簽,是一種用來制作網頁的語言,這種語言由一個個的標簽組成,用…

nodejs的async異步編程

函數有: series waterfall parallel parallelLimit … series函數 串行執行 它的作用就是按照順序一次執行。 async.series({ one: function(callback){ callback(null, 1); }, two: function(callback){ callback(null, 2); } },function(err, results) { conso…

《深入理解Java虛擬機》讀書筆記3--垃圾回收算法

轉載:http://blog.csdn.net/tjiyu/article/details/53983064 下面先來了解Java虛擬機垃圾回收的幾種常見算法:標記-清除算法、復制算法、標記-整理算法、分代收集算法、火車算法,介紹它們的算法思路,有什么優點和缺點,…

python常用函數中文_【python】python常用函數

urlencode與urldecode當url中包含中文或者參數包含中文,需要對中文或者特殊字符(/、&)做編碼轉換。urlencode的本質:把字符串轉為gbk編碼,再把\x替換成%。如果終端是utf8編碼的,需要把結果再轉成utf8輸出,否則會亂…

帶有批注的Spring硒測試

這篇文章描述了如何在Java中實現Selenium測試。 它的靈感來自Alex Collins的帖子,并帶有注釋。 該代碼可在GitHub的Spring-Selenium-Test目錄中找到。 一些替代方法和更輕巧的技術可用于對Spring MVC應用程序進行單元測試。 要進行單元測試服務,請參見此…

sizeof運算符

sizeof是一個單目運算符&#xff0c;它的運算對象是變量或數據類型&#xff0c;運算結果為一個整數。運算的一般形式如下: sizeof(<類型或變量名>) 它只針對數據類型&#xff0c;而不針對變量&#xff01; 若運算對象為變量&#xff0c;則所求的結果是這個變量占用的內存…

oracle 日志切換太頻繁,診斷一次Oracle日志切換頻繁的問題

日志切換&#xff0c;就是生成的日志太大&#xff0c;數據塊的變化太頻繁。Snap IdSnap TimeSessionsCursors/SessionBegin Snap:1456009-Dec-15 04:00:48594.5End Snap:1456109-Dec-15 05:00:59544.6Elapsed:60.19 (mins)DB Time:82.47 (mins)1s產生2M的日志。Per SecondPer T…

Flex布局(一)flex-direction

采用Flex布局的元素&#xff0c;被稱為Flex容器(flex container)&#xff0c;簡稱"容器"。其所有子元素自動成為容器成員&#xff0c;成為Flex項目(Flex item)&#xff0c;簡稱"項目" Flex-direction調整主軸方向&#xff08;默認為水平方向&#xff09;包…

【升級版】如何使用阿里云云解析API實現動態域名解析,搭建私有服務器【含可執行文件和源碼】...

原文地址&#xff1a;http://www.yxxrui.cn/article/179.shtml 未經許可請勿轉載&#xff0c;如有疑問&#xff0c;請聯系作者&#xff1a;yxxrui163.com 我遇到的問題&#xff1a;公司的網絡沒有固定的公網IP地址&#xff0c;但是需要能夠保證的是&#xff0c;每次動態分配的I…

Java管理擴展

什么是JMX&#xff1f; Java管理擴展&#xff08;JMX&#xff09;是一種API&#xff0c;用于管理或監視各種資源&#xff0c;例如應用程序&#xff0c;設備&#xff0c;服務&#xff0c;當然還有JVM。 通過Java社區流程&#xff08;JCP&#xff09;開發&#xff0c;JMX技術被構…

登錄網頁后要彈出一個新標簽_連永久鏈接都不會,還做什么新媒體?

上次給主編大大發的預覽鏈接失效了&#xff0c;被罵得狗血淋頭。大部分運營人可能都遇到過這種情況&#xff0c;忽視了預覽生成的鏈接只是臨時的&#xff0c;在12小時后或超過500閱讀量后就會失效。一個疏忽&#xff0c;給自己帶來了不必要的麻煩&#xff0c;耽誤工作&#xff…