系統緩慢+CPU 100%+頻繁Full GC問題的定位排查思路!

2020-12-14 酷扯兒

本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫

處理過線上問題的同學基本上都會遇到系統突然運行緩慢,CPU 100%,以及Full GC次數過多的問題。

當然,這些問題的最終導致的直觀現象就是系統運行緩慢,並且有大量的報警。

本文主要針對系統運行緩慢這一問題,提供該問題的排查思路,從而定位出問題的代碼點,進而提供解決該問題的思路。

對於線上系統突然產生的運行緩慢問題,如果該問題導致線上系統不可用,那麼首先需要做的就是,導出jstack和內存信息,然後重啟系統,儘快保證系統的可用性。

這種情況可能的原因主要有兩種:

代碼中某個位置讀取數據量較大,導致系統內存耗盡,從而導致Full GC次數過多,系統緩慢;代碼中有比較耗CPU的操作,導致CPU過高,系統運行緩慢;相對來說,這是出現頻率最高的兩種線上問題,而且它們會直接導致系統不可用。另外有幾種情況也會導致某個功能運行緩慢,但是不至於導致系統不可用:

代碼某個位置有阻塞性的操作,導致該功能調用整體比較耗時,但出現是比較隨機的;某個線程由於某種原因而進入WAITING狀態,此時該功能整體不可用,但是無法復現;由於鎖使用不當,導致多個線程進入死鎖狀態,從而導致系統整體比較緩慢。對於這三種情況,通過查看CPU和系統內存情況是無法查看出具體問題的,因為它們相對來說都是具有一定阻塞性操作,CPU和系統內存使用情況都不高,但是功能卻很慢。

下面我們就通過查看系統日誌來一步一步甄別上述幾種問題。

1. Full GC次數過多

相對來說,這種情況是最容易出現的,尤其是新功能上線時。對於Full GC較多的情況,其主要有如下兩個特徵:

線上多個線程的CPU都超過了100%,通過jstack命令可以看到這些線程主要是垃圾回收線程通過jstat命令監控GC情況,可以看到Full GC次數非常多,並且次數在不斷增加。首先我們可以使用

top

命令查看系統CPU的佔用情況,如下是系統CPU較高的一個示例:

top - 08:31:10 up 30 min, 0 users, load average: 0.73, 0.58, 0.34KiB Mem: 2046460 total, 1923864 used, 122596 free, 14388 buffersKiB Swap: 1048572 total, 0 used, 1048572 free. 1192352 cached MemPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 9 root 20 0 2557160 288976 15812 S 98.0 14.1 0:42.60 java

可以看到,有一個Java程序此時CPU佔用量達到了98.8%,此時我們可以複製該進程id

9

,並且使用如下命令查看呢該進程的各個線程運行情況:

top -Hp 9

該進程下的各個線程運行情況如下:

top - 08:31:16 up 30 min, 0 users, load average: 0.75, 0.59, 0.35Threads: 11 total, 1 running, 10 sleeping, 0 stopped, 0 zombie%Cpu(s): 3.5 us, 0.6 sy, 0.0 ni, 95.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stKiB Mem: 2046460 total, 1924856 used, 121604 free, 14396 buffersKiB Swap: 1048572 total, 0 used, 1048572 free. 1192532 cached MemPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10 root 20 0 2557160 289824 15872 R 79.3 14.2 0:41.49 java 11 root 20 0 2557160 289824 15872 S 13.2 14.2 0:06.78 java

可以看到,在進程為

9

的Java程序中各個線程的CPU佔用情況,接下來我們可以通過jstack命令查看線程id為

10

的線程為什麼耗費CPU最高。

需要注意的是,在jsatck命令展示的結果中,線程id都轉換成了十六進位形式。

可以用如下命令查看轉換結果,也可以找一個科學計算器進行轉換:

root@a39de7e7934b:/# printf "%x\n" 10a

這裡列印結果說明該線程在jstack中的展現形式為

0xa

,通過jstack命令我們可以看到如下信息:

"main" #1 prio=5 os_prio=0 tid=0x00007f8718009800 nid=0xb runnable [0x00007f871fe41000]java.lang.Thread.State: RUNNABLE at com.aibaobei.chapter2.eg2.UserDemo.main(UserDemo.java:9)"VM Thread" os_prio=0 tid=0x00007f871806e000 nid=0xa runnable

這裡的VM Thread一行的最後顯示

nid=0xa

,這裡nid的意思就是作業系統線程id的意思。而VM Thread指的就是垃圾回收的線程。

這裡我們基本上可以確定,當前系統緩慢的原因主要是垃圾回收過於頻繁,導致GC停頓時間較長。我們通過如下命令可以查看GC的情況:

root@8d36124607a0:/# jstat -gcutil 9 1000 10S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 0.00 0.00 75.07 59.09 59.60 3259 0.919 6517 7.715 8.635 0.00 0.00 0.00 0.08 59.09 59.60 3306 0.930 6611 7.822 8.752 0.00 0.00 0.00 0.08 59.09 59.60 3351 0.943 6701 7.924 8.867 0.00 0.00 0.00 0.08 59.09 59.60 3397 0.955 6793 8.029 8.984

可以看到,這裡FGC指的是Full GC數量,這裡高達6793,而且還在不斷增長。從而進一步證實了是由於內存溢出導致的系統緩慢。

那麼這裡確認了內存溢出,但是如何查看你是哪些對象導致的內存溢出呢?

這個可以dump出內存日誌,然後通過eclipse的mat工具進行查看,如下是其展示的一個對象樹結構:

經過mat工具分析之後,我們基本上就能確定內存中主要是哪個對象比較消耗內存,然後找到該對象的創建位置,進行處理即可。

這裡的主要是PrintStream最多,但是我們也可以看到,其內存消耗量只有12.2%。

也就是說,其還不足以導致大量的Full GC,此時我們需要考慮另外一種情況,就是代碼或者第三方依賴的包中有顯示的

System.gc()

調用。

這種情況我們查看dump內存得到的文件即可判斷,因為其會列印GC原因:

[Full GC (System.gc()) [Tenured: 262546K->262546K(349568K), 0.0014879 secs] 262546K->262546K(506816K), [Metaspace: 3109K->3109K(1056768K)], 0.0015151 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] [GC (Allocation Failure) [DefNew: 2795K->0K(157248K), 0.0001504 secs][Tenured: 262546K->402K(349568K), 0.0012949 secs] 265342K->402K(506816K), [Metaspace: 3109K->3109K(1056768K)], 0.0014699 secs] [Times: user=0.00

比如這裡第一次GC是由於

System.gc()

的顯示調用導致的,而第二次GC則是JVM主動發起的。

總結來說,對於Full GC次數過多,主要有以下兩種原因:

代碼中一次獲取了大量的對象,導致內存溢出,此時可以通過eclipse的mat工具查看內存中有哪些對象比較多;內存佔用不高,但是Full GC次數還是比較多,此時可能是顯示的System.gc()調用導致GC次數過多,這可以通過添加-XX:+DisableExplicitGC來禁用JVM對顯示GC的響應。2. CPU過高

在前面第一點中我們講到,CPU過高可能是系統頻繁的進行Full GC,導致系統緩慢。而我們平常也肯定能遇到比較耗時的計算,導致CPU過高的情況,此時查看方式其實與上面的非常類似。

首先我們通過

top

命令查看當前CPU消耗過高的進程是哪個,從而得到進程id;

然後通過

top -Hp

來查看該進程中有哪些線程CPU過高,一般超過80%就是比較高的,80%左右是合理情況。這樣我們就能得到CPU消耗比較高的線程id。

接著通過該

線程id的十六進位表示

jstack

日誌中查看當前線程具體的堆棧信息。

在這裡我們就可以區分導致CPU過高的原因具體是Full GC次數過多還是代碼中有比較耗時的計算了。

如果是Full GC次數過多,那麼通過

jstack

得到的線程信息會是類似於VM Thread之類的線程

而如果是代碼中有比較耗時的計算,那麼我們得到的就是一個線程的具體堆棧信息。

如下是一個代碼中有比較耗時的計算,導致CPU過高的線程信息:

這裡可以看到,在請求UserController的時候,由於該Controller進行了一個比較耗時的調用,導致該線程的CPU一直處於100%。

我們可以根據堆棧信息,直接定位到UserController的34行,查看代碼中具體是什麼原因導致計算量如此之高。

3. 不定期出現的接口耗時現象

對於這種情況,比較典型的例子就是,我們某個接口訪問經常需要2~3s才能返回,這是比較麻煩的一種情況。

因為一般來說,其消耗的CPU不多,而且佔用的內存也不高。也就是說,我們通過上述兩種方式進行排查是無法解決這種問題的。

而且由於這樣的接口耗時比較大的問題是不定時出現的,這就導致了我們在通過

jstack

命令即使得到了線程訪問的堆棧信息,我們也沒法判斷具體哪個線程是正在執行比較耗時操作的線程。

對於不定時出現的接口耗時比較嚴重的問題,我們的定位思路基本如下:

首先找到該接口,通過壓測工具不斷加大訪問力度,如果說該接口中有某個位置是比較耗時的,由於我們的訪問的頻率非常高,那麼大多數的線程最終都將阻塞於該阻塞點

這樣通過多個線程具有相同的堆棧日誌,我們基本上就可以定位到該接口中比較耗時的代碼的位置。

如下是一個代碼中有比較耗時的阻塞操作通過壓測工具得到的線程堆棧日誌:

"http-nio-8080-exec-2" #29 daemon prio=5 os_prio=31 tid=0x00007fd08cb26000 nid=0x9603 waiting on condition [0x00007000031d5000]java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at java.lang.Thread.sleep(Thread.java:340) at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386) at com.aibaobei.user.controller.UserController.detail(UserController.java:18)"http-nio-8080-exec-3" #30 daemon prio=5 os_prio=31 tid=0x00007fd08cb27000 nid=0x6203 waiting on condition [0x00007000032d8000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at java.lang.Thread.sleep(Thread.java:340) at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386) at com.aibaobei.user.controller.UserController.detail(UserController.java:18)"http-nio-8080-exec-4" #31 daemon prio=5 os_prio=31 tid=0x00007fd08d0fa000 nid=0x6403 waiting on condition [0x00007000033db000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at java.lang.Thread.sleep(Thread.java:340) at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386) at com.aibaobei.user.controller.UserController.detail(UserController.java:18)

從上面的日誌可以看你出,這裡有多個線程都阻塞在了UserController的第18行,說明這是一個阻塞點,也就是導致該接口比較緩慢的原因。

4. 某個線程進入WAITING狀態

對於這種情況,這是比較罕見的一種情況,但是也是有可能出現的,而且由於其具有一定的「不可復現性」,因而我們在排查的時候是非常難以發現的。

筆者曾經就遇到過類似的這種情況,具體的場景是,在使用CountDownLatch時,由於需要每一個並行的任務都執行完成之後才會喚醒主線程往下執行。

而當時我們是通過CountDownLatch控制多個線程連接並導出用戶的gmail郵箱數據,這其中有一個線程連接上了用戶郵箱。

但是連接被伺服器掛起了,導致該線程一直在等待伺服器的響應。最終導致我們的主線程和其餘幾個線程都處於WAITING狀態。

對於這樣的問題,查看過jstack日誌的讀者應該都知道,正常情況下,線上大多數線程都是處於

TIMED_WAITING

狀態,而我們這裡出問題的線程所處的狀態與其是一模一樣的,這就非常容易混淆我們的判斷。

解決這個問題的思路主要如下:

通過grep在jstack日誌中找出所有的處於TIMED_WAITING狀態的線程,將其導出到某個文件中,如a1.log如下是一個導出的日誌文件示例:

"Attach Listener" #13 daemon prio=9 os_prio=31 tid=0x00007fe690064000 nid=0xd07 waiting on condition [0x0000000000000000]"DestroyJavaVM" #12 prio=5 os_prio=31 tid=0x00007fe690066000 nid=0x2603 waiting on condition [0x0000000000000000]"Thread-0" #11 prio=5 os_prio=31 tid=0x00007fe690065000 nid=0x5a03 waiting on condition [0x0000700003ad4000]"C1 CompilerThread3" #9 daemon prio=9 os_prio=31 tid=0x00007fe68c00a000 nid=0xa903 waiting on condition [0x0000000000000000]

等待一段時間之後,比如10s,再次對jstack日誌進行grep,將其導出到另一個文件,如a2.log結果如下所示:

"DestroyJavaVM" #12 prio=5 os_prio=31 tid=0x00007fe690066000 nid=0x2603 waiting on condition [0x0000000000000000]"Thread-0" #11 prio=5 os_prio=31 tid=0x00007fe690065000 nid=0x5a03 waiting on condition [0x0000700003ad4000]"VM Periodic Task Thread" os_prio=31 tid=0x00007fe68d114000 nid=0xa803 waiting on condition

重複步驟2,待導出3~4個文件之後,我們對導出的文件進行對比,找出其中在這幾個文件中一直都存在的用戶線程這個線程基本上就可以確認是包含了處於等待狀態有問題的線程。因為正常的請求線程是不會在20~30s之後還是處於等待狀態的。經過排查得到這些線程之後,我們可以繼續對其堆棧信息進行排查如果該線程本身就應該處於等待狀態,比如用戶創建的線程池中處於空閒狀態的線程,那麼這種線程的堆棧信息中是不會包含用戶自定義的類的。這些都可以排除掉而剩下的線程基本上就可以確認是我們要找的有問題的線程。通過其堆棧信息,我們就可以得出具體是在哪個位置的代碼導致該線程處於等待狀態了。這裡需要說明的是,我們在判斷是否為用戶線程時,可以通過線程最前面的線程名來判斷

因為一般的框架的線程命名都是非常規範的,我們通過線程名就可以直接判斷得出該線程是某些框架中的線程,這種線程基本上可以排除掉。

而剩餘的,比如上面的

Thread-0

,以及我們可以辨別的自定義線程名,這些都是我們需要排查的對象。

經過上面的方式進行排查之後,我們基本上就可以得出這裡的

Thread-0

就是我們要找的線程,通過查看其堆棧信息,我們就可以得到具體是在哪個位置導致其處於等待狀態了。

如下示例中則是在SyncTask的第8行導致該線程進入等待了。

"Thread-0" #11 prio=5 os_prio=31 tid=0x00007f9de08c7000 nid=0x5603 waiting on condition [0x0000700001f89000]java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) at com.aibaobei.chapter2.eg4.SyncTask.lambda$main$0(SyncTask.java:8) at com.aibaobei.chapter2.eg4.SyncTask$$Lambda$1/1791741888.run(Unknown Source) at java.lang.Thread.run(Thread.java:748)

5. 死鎖

對於死鎖,這種情況基本上很容易發現,因為

jstack

可以幫助我們檢查死鎖,並且在日誌中列印具體的死鎖線程信息。

如下是一個產生死鎖的一個

jstack

日誌示例:

可以看到,在jstack日誌的底部,其直接幫我們分析了日誌中存在哪些死鎖,以及每個死鎖的線程堆棧信息。

這裡我們有兩個用戶線程分別在等待對方釋放鎖,而被阻塞的位置都是在ConnectTask的第5行,此時我們就可以直接定位到該位置,並且進行代碼分析,從而找到產生死鎖的原因。

6. 小結

本文主要講解了線上可能出現的五種導致系統緩慢的情況,詳細分析了每種情況產生時的現象,已經根據現象我們可以通過哪些方式定位得到是這種原因導致的系統緩慢。

簡要的說,我們進行線上日誌分析時,主要可以分為如下步驟:

通過

top

命令查看CPU情況,如果CPU比較高,則通過

top -Hp

命令查看當前進程的各個線程運行情況

找出CPU過高的線程之後,將其線程id轉換為十六進位的表現形式,然後在jstack日誌中查看該線程主要在進行的工作。

這裡又分為兩種情況:

如果是正常的用戶線程,則通過該線程的堆棧信息查看其具體是在哪處用戶代碼處運行比較消耗CPU;如果該線程是VM Thread,則通過jstat -gcutil命令監控當前系統的GC狀況然後通過jmap dump:format=b,file=導出系統當前的內存數據。導出之後將內存情況放到eclipse的mat工具中進行分析即可得出內存中主要是什麼對象比較消耗內存,進而可以處理相關代碼;如果通過

top

命令看到CPU並不高,並且系統內存佔用率也比較低。此時就可以考慮是否是由於另外三種情況導致的問題。

可以根據具體情況分析:

如果是接口調用比較耗時,並且是不定時出現,則可以通過壓測的方式加大阻塞點出現的頻率,從而通過jstack查看堆棧信息,找到阻塞點;如果是某個功能突然出現停滯的狀況,這種情況也無法復現,此時可以通過多次導出jstack日誌的方式對比哪些用戶線程是一直都處於等待狀態,這些線程就是可能存在問題的線程;如果通過jstack可以查看到死鎖狀態,則可以檢查產生死鎖的兩個線程的具體阻塞點,從而處理相應的問題。本文主要是提出了五種常見的導致線上功能緩慢的問題,以及排查思路。

當然,線上的問題出現的形式是多種多樣的,也不一定局限於這幾種情況,如果我們能夠仔細分析這些問題出現的場景,就可以根據具體情況具體分析,從而解決相應的問題。

相關焦點

  • 乾貨|Java 線上故障排查完整套路!牛掰!
    如果看到 gc 比較頻繁,再針對 gc 方面做進一步分析,具體可以參考一下 gc 章節的描述。上下文切換針對頻繁上下文問題,我們可以使用vmstat命令來進行查看cs(context switch)一列則代表了上下文切換的次數。
  • 伺服器性能指標 負載(Load)分析及問題排查
    平常的工作中,在衡量伺服器的性能時,經常會涉及到幾個指標,load、cpu、mem、qps、rt等。每個指標都有其獨特的意義,很多時候在線上出現問題時,往往會伴隨著某些指標的異常。大部分情況下,在問題發生之前,某些指標就會提前有異常顯示。
  • 安卓App性能專項測試指標之CPU深度解析
    這是因為CPU使用率過高、CPU過於繁忙,會使得整個系統無法響應用戶,整體性能降低,用戶體驗變得相當差,也容易引起ANR等等一系列問題。 前面三行cpu cpu0 cpu1是我們需要關注的重點。cpu0、cpu1表示當前CPU的核心(雙核)。cpu為總的Jiffies,這裡引入了Jiffies(時間片)的概念。
  • 如何減少長時間的GC暫停?
    因此,在本文中,我列出了可能導致長時間GC暫停的主要原因,以及解決這些問題的潛在解決方案。1.高對象創造率如果您的應用程式的對象創建率很高,那麼為了跟上它,垃圾回收率也將很高。高垃圾回收率也會增加GC暫停時間。因此,優化應用程式以創建更少的對象是減少長時間GC暫停的有效策略。這可能是一個耗時的練習,但值得100%進行。
  • 三星回應大面積手機系統崩潰 積極排查原因 系統崩潰臨時解決辦法
    三星回應大面積手機系統崩潰 積極排查原因 系統崩潰臨時解決辦法 2020-05-24 08:28:31 來源:中新經緯  |  作者:佚名> | 字號:A+ | A- 【三星回應手機系統崩潰】23日,部分三星手機用戶反映遭遇黑屏和大面積重啟問題,對此三星蓋樂世手機通過官方微博「三星GALAXY蓋樂世」回應稱已收到部分用戶對於系統問題的反饋,目前正在積極排查原因並儘快提供相應的解決方案
  • e1500cpu多少錢 e1500cpu報價及評測【詳解】
    e1500cpu是因特爾旗下的一款經典暢銷產品,它定價不高。但是性能參數以及與機子的適配方面的表現十分出色,這也使得e1500cpu成為高性價比高口碑的卓越代表。那麼接下來不妨就隨小編一起來了解幾個關於e1500cpu的相關方面的信息吧。我們將為大家詳細介紹e1500cpu的報價、評測以及支持主板舉例這三個板塊的文字圖片內容。
  • 威縣供熱辦溫馨提示:室內供熱系統常見故障的排查與處理方法
    威縣供熱辦溫馨提示:室內供熱系統常見故障的排查與處理方法 2020-12-09 19:31 來源:澎湃新聞·澎湃號·政務
  • 溫馨提示:供暖故障問題排查
    溫馨提示:供暖故障問題排查 2020-12-09 17:59 來源:澎湃新聞·澎湃號·政務
  • 這裡有詳細的應急排查手冊!
    >遠控、後門、勒索軟體信息洩漏:拖褲、資料庫登錄(弱口令)網絡流量:頻繁發包、批量請求、DDOS攻擊2 排查思路一個常規的入侵事件後的系統排查思路:假如系統的命令(例如netstat ls 等)被替換,為了進一步排查,需要下載一新的或者從其他未感染的主機拷貝新的命令。發現可疑可執行的木馬文件,不要急於刪除,先打包備份一份。發現可疑的文本木馬文件,使用文本工具對其內容進行分析,包括回連IP位址、加密方式、關鍵字(以便擴大整個目錄的文件特徵提取)等。
  • 電腦知識講解:CPU溫度多少正常?CPU溫度過高怎麼辦?
    引起電腦溫度高最主要的原因就是散熱的問題,比如一般筆記本電腦的cpu的溫度都要明顯高於桌上型電腦的cpu溫度。主要是因為筆記本由於受到體積小的影響。一:CPU的正常溫度範圍CPU 在85°以上。幾乎可以不用要了。。CPU在 75-85°之間。換個風扇還可能救回來。CPU在50-74°之間。溫度正常。CPU在30-50°之間。
  • 4am韋神為何稱呼gc為少爺?關於gc背後的人
    昨天PCL春季賽淘汰賽第一天的比賽打完,OIG戰隊倒數第一表現不佳,gc更是6場1殺場均傷害只有51,遭到了網友的瘋狂吐槽。前幾天韋神在obPCL春季賽常規賽看到OIG戰隊一波戰鬥時說了一句「少爺以前就這樣」。那麼韋神為什麼會稱呼gc為少爺呢?
  • cpu風扇多少錢一個 cpu風扇價格及性能介紹
    說到cpu 風扇 ,相信大家都知道,它主要是安裝在電腦主機裡面的風扇,它能夠快速地幫助我們的電腦將CPU裡面的熱量傳導出來,然後利用風力吹出去,通過這樣的方式來達到幫助CPU散熱的效果。但是有時候cpu風扇可能因為使用的時間比較長有時候會出現噪音大或者損壞的現象,這個時候我們想要更換一個新的。那麼,cpu風扇多少錢一個呢?
  • dell cpu溫度過高怎麼辦 戴爾電腦cpu溫度過高解決辦法
    CPU溫度如果過高的話,就會導致電腦出現自動關機或者重啟的問題。所以近日有使用dell電腦的用戶就問小編,dell cpu溫度過高該如何處理?針對這一問題,今天本文就來為大家整理分享關於戴爾電腦cpu溫度過高的解決辦法。
  • CPU的那些後綴是啥意思?一文教你讀懂CPU的型號標識!
    如果你不知道cpu是什麼,請點這裡:CPU到底是什麼,一文弄通!
  • 你的筆記本可以更換cpu嗎?筆記本cpu的幾種封裝形式
    你的筆記本可以更換cpu麼?很多網友的筆記本用了四五年之後性能告急,可否通過更換cpu來升級陪伴了我們很多年的愛機呢?今天我們來看一看。cpu但是仍然改成了BGA封裝進行製造。但是也不是完全不可以更換,有的時候,恰好你的BGA封裝的cpu壞掉了,趁此機會可以進行升級,反正總要賭一把,還不如趁機升級。
  • 水冷和風冷的區別:cpu散熱器選風冷好還是水冷好?
    水冷和風冷的區別:cpu在電腦配件中是發熱量最高的配件,而給cpu降溫的東西就是散熱器了,目前cpu散熱器分為風冷和水冷兩種
  • 網友:比日本的定位系統厲害100倍不止!
    前不久,北鬥全球系統最後一顆組網衛星發射成功,從此我們可以不依賴於美國的gps系統,我們自己的定位系統,自己做主。 我們都知道世界上有四大全球導航系統和兩個區域性導航系統,他們的所有者分別是:美國,歐盟,中國,俄羅斯,日本,印度。
  • 新品試用 | 孩子頻繁生病,是不是免疫系統有問題?
    想讓孩子快點好起來,想讓孩子少生病,是所有家長都極需解決的問題。那麼當孩子頻繁生病,我們能做點什麼呢?一、孩子頻繁生病是不是免疫系統有問題?很多爸爸媽媽覺得孩子會不會生病生得太頻繁了?實際上,寶寶通常會從6個月後開始生病(通常是感冒),因為出生時從媽媽那裡獲得的免疫力開始衰減。寶寶開始無時無刻暴露在「新的」病毒中——很多成年人已經免疫的病毒,對寶寶的免疫系統來說都是初次交手。在沒有作戰經驗的情況下,就會因被病毒入侵導致生病,而這也是寶寶在發展壯大起自己免疫系統的過程。
  • 天津水域建成無線電幹擾監測系統 「千裡眼」精準定位水上幹擾源
    其中,該中心在天津水域建成的無線電幹擾監測系統,填補了國內空白。  據介紹,水上無線電通信是船舶之間、船舶與船舶交管中心之間溝通交流的重要手段,但個別船舶存在私設大功率無線電設備、隨意佔用無線電公用頻段等違規行為,對水上交通安全造成較大影響。此前,由於查處手段和相關設備的欠缺,對於此類行為往往難以定位,因此也缺乏手段進行治理。
  • 監控系統安裝注意事項及簡單故障排查方法
    我們先略過監控攝像頭安裝前期的一些工具、輔助材料、配件,著重聊一下安裝過程中經常遇到的一些問題。監控攝像頭安裝組網攝像頭安裝組網的時候需要對整個安裝環境有所了解。只有充分了解安裝環境的布局,才能合理地制定線路走向。根據線路走向制定合理的組網方式,既要保證監控系統的功能效果,又節約成本預算。