系统通知并发问题_玩转Java高并发?请先说明下并发下的惊群效应
實際項目中,我們有很多高并發的場景需要考慮、設計,在高并發領域有個很有特點的名詞叫驚群效應,你了解嗎?
一、啥是驚群效應
啥叫驚群效應,有個例子說明的很透徹。當你往一群鴿子中間扔一塊食物,雖然最終只有一個鴿子搶到食物,但所有鴿子都會被驚動來爭奪,沒有搶到食物的鴿子只好回去繼續睡覺, 等待下一塊食物到來。這樣,每扔一塊食物,都會驚動所有的鴿子,即為驚群。
也就是說,雖然只扔了一塊實物,但是驚動了整個鴿群,最后只有一個鴿子搶到食物了,浪費了其他鴿子的能量。
二、驚群導致的問題
對于操作系統來說,多個進程/線程在等待同一資源是,也會產生類似的效果,其結果就是每當資源可用,所有的進程/線程都來競爭資源,造成了資源的浪費。
三、常見的驚群場景
1、linux驚群
linux中驚群主要是accept驚群和epoll驚群。
1)accept驚群,以多進程為例,在主進程創建監聽描述符listenfd后,fork()多個子進程,多個進程共享listenfd,accept是在每個子進程中,當一個新連接來的時候,會發生驚群。
2)epoll驚群分兩種,一是在fork之前創建epollfd,所有進程共用一個epoll;二是在fork之后創建epollfd,每個進程獨用一個epoll。
epoll驚群和accept驚群類似,共享一個epollfd, 加鎖或標記解決。在新的linux內核版本中都已得到解決。
2、nginx驚群
在nginx中使用的epoll,是在創建進程后創建的epollfd。因些會出現類似linux的驚群問題。即每個子進程worker都會驚醒。
nginx使用了互斥鎖來解決驚群的問題。
- 采用了主動的方法去把監聽描述符放到epoll中或從epoll移出。
- 采用互斥鎖去解決誰來accept問題,保證了同一時刻,只有一個worker接收新連接(所以nginx并沒有驚群問題)。
- 根據自已的載負情況,決定去不去搶鎖,簡單方便地解決負載,防止進程因業務太多而導致所有業務都不及時處理。
3、線程池驚群
多線程設計中,經常會用到互斥和條件變量的問題。當一個線程解鎖并通知其他線程的時候,就會出現驚群的現象。
這里的驚群現象出現在3里,pthread_cond_signal,語義上看,是通知一個線程。調用此函數后,系統會喚醒在相同條件變量上等待的一個或多個線程(可參看手冊)。如果通知了多個線程,則發生了驚群。
1)一般用法,
- 所有線程共用一個鎖,共用一個條件變量。
- 當pthread_cond_signal通知時,就可能會出現驚群
2)解決驚群的方法,
- 所有線程共用一個鎖,每個線程都有自己的條件變量。
- pthread_cond_signal通知時,定向通知某個線程的條件變量,不會出現驚群。
好了,驚群效應大體了解了吧。驚群有不同的場景和解決方案,在高并發場景下,需要做適當考慮哦。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的系统通知并发问题_玩转Java高并发?请先说明下并发下的惊群效应的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 陈百强原来这么帅_外套假两件,原来这么帅
- 下一篇: 限定概率抽奖_圣诞节LOL紫色宝箱30连