我也是一个线程,为什么每天累得像狗一样?
我的編號是0x7954,我以為世界上的人都和我一樣,一出生就忙碌個不停,一直忙到世界的毀滅。
我每天與CPU阿甘為伍,忙著讀寫內存,一刻不得閑,阿甘這傻小子的速度實在是太快,指令周期都是按納秒計算的,他經常對我說的一句話就是:快點兒,跟上!
我就納悶了,這程序員都是996,至少有一天可以休息,我這怎么得7*24工作啊,每天累得像狗一樣!
不過讀寫內存這個活是老大分配給我的,我認命。
有一天深夜,工作很少,我終于可以稍微休息一下,和CPU阿甘聊了一會兒,他無意中提起一件事:“這個機器原來安裝過一個叫Tomcat的軟件,這Tomcat運行起來以后,會啟動很多線程,他們的日常工作就是處理各種各樣的包裹。”
“還存在這樣的世界?有多少線程啊?” 我很驚訝, 為什么老大只安排我一個人干活? 孤零零的。
“沒錯,Tomcat有個線程池,具體有多少個線程我也不清楚,這些線程在處理包裹的時候,有些就是執行一下簡單的業務邏輯代碼,馬上返回,有些需要訪問數據庫,有些需要讀寫文件,有些還要通過網絡來訪問別的系統,這個時候就可以阻塞休息了, 對了,其中有個叫做0x3074的線程特別出名。”
CPU給我講了一下0x3704的故事,都在《我是一個線程》當中。
聽完后我心情低落,十分委屈,我也是一個線程,人家的生活多么豐富多彩,線程還會阻塞,一伙人可以聚在一起喝茶、聊天、打牌。哪像我,像個驢子一樣每時每刻都在轉圈拉磨。
“后來Tomcat去哪里了?” ?我十分憧憬,幻想著自己也能成為其中的一個線程,和0x3704談天說地。
“程序員把他們關閉了,然后搬了家,到另外一臺機器上啟動了,才把這個機器單獨留給了你們老大: Redis,現在專門用來緩存數據。你每秒處理上萬次的緩存讀寫請求, 也許就有0x3704發過來的。”
原來如此! 這世界上不止我一個線程,還有很多線程在訪問我們Redis緩存。
我算是明白了老大為什么要我把放到墻內,這一旦了解了外邊的花花世界,心就野了,每天帶著怨氣工作,屢屢出錯。
Redis老大看到我狀態不佳,趕緊跑來慰問:“0x7954,最近是怎么回事啊!”
我沒聲好氣地說:“為什么只有我一個線程在干活!”
“誰說只有你一個? 做持久化的時候,比如RDB的bgsave,那不是有別的線程在干活嘛!”
“我說的是讀寫內存中緩存數據的線程!為什么只有我一個? ”看到老大想轉移矛盾,我趕緊把他拉回來,“人家Tomcat能弄個線程池,里邊很多線程,大家都可以阻塞休息,我們為什么不能這么做?!”
Redis老大聽到我這么說,就知道外邊的世界無法對我隱藏了, 只好對我解釋:“我做出這么一個決定是有原因的,最主要的原因就是我們負責的業務和Tomcat不同!”
老大從懷里掏出一張圖,小心翼翼地遞給我:“這可是寶貝,別弄壞了:”
看到滿紙的英文,我真是后悔為什么不把四級學好。
不過我還是看出了端倪,這CPU阿甘最快,一個時鐘周期是0.3納秒,內存訪問需要120納秒,固態硬盤訪問需要50-150微秒,傳統硬盤訪問需要1-10毫秒, 網絡訪問最慢,需要幾十到上百毫秒。
如果CPU阿甘的一個時鐘周期按1秒算,那內存訪問就是6分鐘,固態硬盤是2-6天,傳統硬盤是1-12個月,網絡訪問就是幾年了!
(1秒= 1000毫秒= 1000,000 微秒 = 1000,000,000納秒)
都是人類制造的電腦設備,這速度差異怎么如此之大! 可是這和我有什么關系?
Redis老大說:“ 我們負責的業務主要是和內存打交道,你每天就是讀寫內存的那些數據結構,像string ,hash, set, list等等,內存的速度是很快的。我們來假設一個場景, 有10萬個請求發給了我們Redis, 假設你10微秒處理一個,那這10萬個請求,你1秒內就輕松搞定!但是如果同樣多的請求發給Tomcat,它的線程需要讀寫文件,訪問硬盤,甚至網絡,速度那是非常非常慢的,假設平均處理時間是10毫秒,你算算需要多長時間?”
我稍加計算,嚇了一跳,需要1000秒才能搞定,這實在是太慢了,人類是萬萬等不及的。
Redis老大說:“所以嘛,那Tomcat肯定要建立一個線程池,里邊養一堆線程來干活嘍。并且,一個Tomcat還不夠,需要多個Tomcat組成集群來分擔壓力,他是不得已而為之。”
原來如此,看來業務不同,這工作模式也大為不同啊! ?可是不對啊,這么多的網絡請求肯定是很慢的啊!
“這個不用你操心,我們是非阻塞的I/O,使用了epoll作為I/O多路復用的實現,我還有一個自己的事件處理模型,不會在網絡I/O上浪費時間。 ” Redis老大深思熟慮,早就考慮到了這一點。
“單線程還有一個重要的好處就是,不用給資源加鎖,所有的命令都會放到一個隊列中,你只要從隊列中取出指令,逐個執行就可以了,根本不用考慮鎖的問題,非常安全。”
“最后還有一點,由于只有你一個線程,也沒有線程切換開銷了,你一個人獨霸CPU阿甘。”(確切來說,只能用一個CPU 核心)
老大一口氣說了這個么多好處,我無語了,資本家真壞,看來我這輩子就是勞累命。
不過不能就這么算了,我還得提出那個關鍵問題:“我7*24小時工作,也該長點兒工資了!”
“沒問題,等到張大胖給我們加了內存,我就給你發雙份工資!”
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的我也是一个线程,为什么每天累得像狗一样?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis:MySQL算老几?
- 下一篇: 当创建对象时......