第2225章 資金洪流與技術噩夢
凌晨三點十七分。
開發部的燈全亮著,那種慘白的光從天花板上打下來,把每個人的臉色都照得發灰。
三排長條桌拼成一張大工作檯,桌面上堆著十幾隻外賣盒,一次性筷子橫七豎八地插在吃剩的米飯里,飯粒干透了,黏在塑料盒壁上摳都摳不下來。
桌上還有幾罐沒喝完的可樂,罐身上凝著水珠,順著鋁皮往下淌,在桌面留下一圈一圈的水漬。
桌面中間那台主機的風扇轉得最響,持續不斷的嗡鳴聲蓋過了其他所有機器的動靜。
電源指示燈是藍的,但在高速運轉的時候燈芯微微發顫,像是裡面的電流也在跟著喘。
李軒坐在主控機前面,上半身往前傾,兩隻手肘撐在桌面上,手指搭著鍵盤,姿勢維持了快兩個小時沒變過。
他眼皮底下掛著兩圈青,顏色很深,像是用指腹沾了灰揉上去的。
屏幕上的伺服器端狀態日誌還在滾動,綠色字符一行一行往上冒,速度不快不慢,看著特別規律。
他盯著屏幕,眼球跟著字符移動,嘴唇微微張開一條縫,呼吸很淺,整個人的狀態像一台待機的機器,盯著盯著,手指終於動了一下,按了個鍵。
日誌停了。
最後一行字停在「連接池溢出,請求隊列長度超過閾值,系統強制關閉新連接」。
他盯著那行字,大概看了有十秒,眼珠都沒動。
然後他伸手端起桌角那隻茶杯,杯壁早就涼透了,他喝了一口,涼掉的茶水順著喉嚨往下走,他咽下去的時候喉結動了一下。
放杯子的時候他的手重了些,杯底磕在桌面上,「咚」一聲悶響,聽著跟敲在木板上似的。
坐他對面的那個男生抬起頭來,他懷裡一直抱著個黑包,包帶子繞在手腕上纏了兩圈,不知道的還以為裡頭裝著什麼貴重東西,其實就是他平時背的電腦包。
他鼻樑上架著一副無框眼鏡,鏡片上有幹掉的油漬,大概是誰吃外賣的時候濺上去的,他也沒擦。
他抬頭的時候眼鏡往下滑了一點,他往上推了推鏡架,看著李軒:「又崩了?」
「崩了。」李軒的聲音很平,尾音往下墜,聽著就跟在說今天吃的是蓋飯一樣,沒什麼情緒起伏,「並發數上了兩千三,連接池就扛不住了。
日誌顯示握手階段信號重發次數太多,超時之後大量連接卡在等待態,後面的請求全被堵在外面進不來。」
「兩千三?」抱黑包的男生皺了皺眉,「昨天我們跑到兩千一的時候還穩著呢。」
「是穩著。
但今天就崩了。」李軒說這話的時候伸手揉了揉後頸,脖子發出一聲輕微的咔嗒響,「昨天改的是接收緩衝區的大小,擴了兩倍。
但問題不在緩衝區上,握手階段的確認機制才是瓶頸。
你接收再大的包,握手握不上來,一樣白搭。」
隔壁桌的短髮女生湊過來半個身子。
她坐在角落的位置,顯示器屏幕的光映在她的瞳孔里,兩個亮點在眼珠正中間亮著。
她手裡捏著一支筆,筆帽被她咬得全是牙印。
「昨天改接收緩衝區的時候我就說了,那玩意兒治標不治本,握手協議那塊的邏輯才是根子上的毛病。
我當時看了代碼,握手確認那邊有一個等待窗口,窗口時長設的是固定的,網絡稍微波動一下窗口一卡,整個連接就拖死在那兒了。」
李軒沒接話。
他把鍵盤往前推了推,整個人往後靠進椅背里,椅子發出「嘎吱」一聲響。
他閉上眼,兩隻手交叉搭在肚子上。
他的眼球在眼皮底下快速地動著,左邊動兩下,右邊動兩下,頻率特別快,像是在腦子裡把代碼從頭到尾跑了一遍。
辦公室里其他幾個人都沒出聲,風扇嗡嗡轉著,掛鐘的秒針一下一下往前走,「嗒、嗒、嗒」,聲音不大,但在安靜的環境裡聽得清清楚楚。
然後李軒睜開眼,坐直身體,把鍵盤拉回面前,噼里啪啦地開始翻代碼。
他的手指在鍵盤上敲得很快,光標在屏幕上跳來跳去,一行一行的邏輯結構在他眼前過。
他一邊翻一邊小聲念叨著什麼,聲音含在嘴裡,聽不太清楚,像自言自語。
辦公室里的氣壓很低。
其他幾個人也都坐著沒動,有人盯著自己的屏幕發呆,有人把腦袋枕在胳膊上合著眼。
外賣盒裡散發出來的味道混在一起——油的,辣的,還有米飯放久了之後那股微酸的餿味。
但沒人去收拾,也沒人開窗。
所有人都在等,等李軒那段代碼翻出一個結果來。
梁永琪推門進來的時候,身上穿著一件灰色的薄外套,拉鏈拉到胸口的位置,露出裡面白色的T恤領子。
她手裡拎著兩隻白色塑膠袋,袋口冒著熱氣,塑膠袋壁上凝了一層水霧。
她把塑膠袋放在靠門邊的那張空桌上,袋底落下去的時候發出輕微的響動。
「買了豆漿和包子,你們輪流過來吃,別一窩蜂擠著。」她說這話的時候聲音不大,但口齒清晰,每個字都送得到位。
然後她走到李軒身後,低頭看著他的屏幕。
她沒有出聲,就那麼站著,兩隻手插在外套口袋裡,目光落在屏幕上的代碼行間。
她看了一會兒,沒有提問,也沒有催。
她知道李軒在做什麼,知道他現在腦子裡正轉著什麼東西。
她就等著。
李軒沒有回頭看她,也沒有去碰那袋早飯。
他的手指在鍵盤上敲了幾下,光標在某一行代碼前面停下來,那一行用紅色高亮標著,是握手協議里確認信號的處理邏輯。
他把光標停在那個函數名上,開口說了句:「如果握手改成三次確認之後不做連接池預分配,改成動態申請的話,能不能解決握手階段的阻塞問題?不提前占坑,有請求來了再分配資源,握手階段就不會因為池子滿了卡死了吧?」
他旁邊坐的抱黑包的男生聽了,皺了皺眉,張了張嘴想說點什麼,但沒說出來。
他自己也在想這個問題,一時半會兒拿不準。
梁永琪聽完李軒的話,沒有急著表態。
她動作很自然地拿出手機,拇指在屏幕上按了幾下,把李軒剛才說的那段話精簡了一下,打了一行字發給陳浩。
發送成功的提示跳出來之後她把手機屏幕朝下扣在桌面邊緣,等著。
手機屏幕亮著,顯示收件人那一欄寫著「浩哥」,消息內容縮成一行小字,看不太清。
辦公室里又安靜下來。
李軒的手指懸在鍵盤上方沒落下去,他在等反饋。
梁永琪靠在桌邊,眼睛看著手機屏幕的方向。
大約過了兩分鐘,手機震了一下。
她翻過手機,點開簡訊,陳浩回過來的內容不長,就一行字,她看完之後把屏幕轉向李軒。
李軒湊過去看,屏幕上寫著:「動態申請會引入新的分配延遲,客戶端在握手確認後等待分配的那幾百毫秒里如果發來後續包,會被當作無效連接處理。
問題不在分配方式,在協議層的握手時序。」
李軒盯著這條回復看了兩遍。
他眉頭先是皺起來,眉心擠出一道豎紋,然後那道紋路又慢慢鬆開,像是腦子裡有什麼東西「啪」一下接通了。
他把手從鍵盤上抬起來,兩隻手搓了搓臉,搓到指腹壓著眼眶的時候停了一下,指頭按著眼皮,好像在讓眼球緩一緩。
他放下手,問:「那他有沒有說什麼方案?」
梁永琪又發了一條簡訊過去。
這回她打的是「握手時序怎麼改」。
她打字很快,拇指在屏幕上點了幾下就發出去了。
回信來得比剛才快,大概只隔了一分鐘,手機震了一下。
她點開,陳浩的回覆只有一句話:「把客戶端的第一個數據包從握手之後改到握手確認之前發,伺服器收到即認為連接有效。」
李軒看完這條,整個人頓住了。
他的目光停在屏幕上的那行字上,嘴裡無聲地動了幾個字,像是在把這句話拆開了嚼碎了往肚子裡咽。
他保持那個姿勢大概有五六秒,然後猛地轉過身面朝主控機,手指落在鍵盤上噼里啪啦地敲起來。
他敲得很快,幾乎沒停頓,一邊敲一邊說:「把握手確認之前的等待窗口去掉,客戶端在發第三次握手確認的時候同時帶第一個數據包,伺服器收到之後同時完成連接建立和數據接收。
這樣握手和首包合併成一個原子操作,連接池的占用時間縮短了三分之二。
原來一個連接從握手到建立要將近一秒鐘,現在壓縮到三百毫秒以內。
池子裡的連接轉得過來,後面排隊進來的就能接上了。」
他旁邊的短髮女生已經湊過來了,腦袋幾乎要貼上他的肩膀。
她盯著屏幕上正在改的代碼,眼睛眯起來。
「這樣改的話,首包丟了怎麼辦?客戶端發的確認裡帶了數據包,伺服器那邊沒收到的話,整個連接怎麼處理?」
「首包丟失客戶端重發握手確認,整個連接重建。
丟一次重建一次,跟原來的邏輯比多了一次重傳開銷,但丟包率本身不高,這個代價可以接受。」李軒敲完最後幾行,手指在回車鍵上用力按了一下,按下去的時候發出「啪」的一聲。
他按了保存,然後從椅子上站起來,走到那台主機的側面蹲下去,把側板掀開,用手電筒照著檢查了一下內存條的插接狀態。
他拔下來一根,用拇指擦了擦金手指,又重新插緊。
「先跑一遍單線程測試,過了再上並發。
你們別圍在這兒了,去吃早飯,包子該涼了。」
他說完這話,自己卻沒去拿包子。
他蹲在主機邊上,仰著頭看機箱裡的走線,一根一根地順著線捋過去,像是怕哪個接口鬆了影響測試結果。
其他幾個人慢慢動了。
抱黑包的男生把懷裡的包擱在桌上,走到門邊的桌子前拎了一隻塑膠袋回來,從裡面掏出一隻包子咬了一口,嚼了兩下,又拿起豆漿喝了一口。
豆漿已經不太燙了,溫的。
短髮女生也走過去拿了一隻包子,靠在桌邊慢慢吃,她吃得慢,一小口一小口地咬,眼睛還盯著李軒那邊的屏幕。
辦公室里瀰漫著包子的麵皮味和豆漿的豆腥氣。
有人吃了幾口之後打了個嗝,聲音不大,悶在嘴裡。
李軒檢查完機箱,把側板蓋上擰好螺絲,回到主控機前面坐下。
他點開剛才保存的代碼,重新編譯了一遍,編譯過了之後開始跑單線程測試。
屏幕上跳出來測試進度條,一格一格往前移。
梁永琪靠在門框邊上,抱著胳膊看著屋裡這些人。
她的視線從李軒的側臉移到那個吃包子的男生身上,又移到短髮女生身上,最後落回李軒的屏幕上。
她沒出聲,就那麼站著。
單線程測試跑完了,通過。
李軒深吸了一口氣,手指懸在鍵盤上方,停了兩三秒,然後開始調並發測試參數。
他把並發數從兩千三往上調,先調了兩千五,確認跑起來沒崩,又往上調到三千,還是沒崩,再調三千五。
測試跑起來之後,所有人都停了手裡的動作,目光往主控機的屏幕這邊聚過來。
時鐘一秒一秒地走,屏幕上顯示並發連接數穩定在三千五上下,伺服器響應時間沒有明顯波動,日誌里沒有再出現連接池溢出的報錯。
【跪求禮物,免費的為愛發電也行!】
開發部的燈全亮著,那種慘白的光從天花板上打下來,把每個人的臉色都照得發灰。
三排長條桌拼成一張大工作檯,桌面上堆著十幾隻外賣盒,一次性筷子橫七豎八地插在吃剩的米飯里,飯粒干透了,黏在塑料盒壁上摳都摳不下來。
桌上還有幾罐沒喝完的可樂,罐身上凝著水珠,順著鋁皮往下淌,在桌面留下一圈一圈的水漬。
桌面中間那台主機的風扇轉得最響,持續不斷的嗡鳴聲蓋過了其他所有機器的動靜。
電源指示燈是藍的,但在高速運轉的時候燈芯微微發顫,像是裡面的電流也在跟著喘。
李軒坐在主控機前面,上半身往前傾,兩隻手肘撐在桌面上,手指搭著鍵盤,姿勢維持了快兩個小時沒變過。
他眼皮底下掛著兩圈青,顏色很深,像是用指腹沾了灰揉上去的。
屏幕上的伺服器端狀態日誌還在滾動,綠色字符一行一行往上冒,速度不快不慢,看著特別規律。
他盯著屏幕,眼球跟著字符移動,嘴唇微微張開一條縫,呼吸很淺,整個人的狀態像一台待機的機器,盯著盯著,手指終於動了一下,按了個鍵。
日誌停了。
最後一行字停在「連接池溢出,請求隊列長度超過閾值,系統強制關閉新連接」。
他盯著那行字,大概看了有十秒,眼珠都沒動。
然後他伸手端起桌角那隻茶杯,杯壁早就涼透了,他喝了一口,涼掉的茶水順著喉嚨往下走,他咽下去的時候喉結動了一下。
放杯子的時候他的手重了些,杯底磕在桌面上,「咚」一聲悶響,聽著跟敲在木板上似的。
坐他對面的那個男生抬起頭來,他懷裡一直抱著個黑包,包帶子繞在手腕上纏了兩圈,不知道的還以為裡頭裝著什麼貴重東西,其實就是他平時背的電腦包。
他鼻樑上架著一副無框眼鏡,鏡片上有幹掉的油漬,大概是誰吃外賣的時候濺上去的,他也沒擦。
他抬頭的時候眼鏡往下滑了一點,他往上推了推鏡架,看著李軒:「又崩了?」
「崩了。」李軒的聲音很平,尾音往下墜,聽著就跟在說今天吃的是蓋飯一樣,沒什麼情緒起伏,「並發數上了兩千三,連接池就扛不住了。
日誌顯示握手階段信號重發次數太多,超時之後大量連接卡在等待態,後面的請求全被堵在外面進不來。」
「兩千三?」抱黑包的男生皺了皺眉,「昨天我們跑到兩千一的時候還穩著呢。」
「是穩著。
但今天就崩了。」李軒說這話的時候伸手揉了揉後頸,脖子發出一聲輕微的咔嗒響,「昨天改的是接收緩衝區的大小,擴了兩倍。
但問題不在緩衝區上,握手階段的確認機制才是瓶頸。
你接收再大的包,握手握不上來,一樣白搭。」
隔壁桌的短髮女生湊過來半個身子。
她坐在角落的位置,顯示器屏幕的光映在她的瞳孔里,兩個亮點在眼珠正中間亮著。
她手裡捏著一支筆,筆帽被她咬得全是牙印。
「昨天改接收緩衝區的時候我就說了,那玩意兒治標不治本,握手協議那塊的邏輯才是根子上的毛病。
我當時看了代碼,握手確認那邊有一個等待窗口,窗口時長設的是固定的,網絡稍微波動一下窗口一卡,整個連接就拖死在那兒了。」
李軒沒接話。
他把鍵盤往前推了推,整個人往後靠進椅背里,椅子發出「嘎吱」一聲響。
他閉上眼,兩隻手交叉搭在肚子上。
他的眼球在眼皮底下快速地動著,左邊動兩下,右邊動兩下,頻率特別快,像是在腦子裡把代碼從頭到尾跑了一遍。
辦公室里其他幾個人都沒出聲,風扇嗡嗡轉著,掛鐘的秒針一下一下往前走,「嗒、嗒、嗒」,聲音不大,但在安靜的環境裡聽得清清楚楚。
然後李軒睜開眼,坐直身體,把鍵盤拉回面前,噼里啪啦地開始翻代碼。
他的手指在鍵盤上敲得很快,光標在屏幕上跳來跳去,一行一行的邏輯結構在他眼前過。
他一邊翻一邊小聲念叨著什麼,聲音含在嘴裡,聽不太清楚,像自言自語。
辦公室里的氣壓很低。
其他幾個人也都坐著沒動,有人盯著自己的屏幕發呆,有人把腦袋枕在胳膊上合著眼。
外賣盒裡散發出來的味道混在一起——油的,辣的,還有米飯放久了之後那股微酸的餿味。
但沒人去收拾,也沒人開窗。
所有人都在等,等李軒那段代碼翻出一個結果來。
梁永琪推門進來的時候,身上穿著一件灰色的薄外套,拉鏈拉到胸口的位置,露出裡面白色的T恤領子。
她手裡拎著兩隻白色塑膠袋,袋口冒著熱氣,塑膠袋壁上凝了一層水霧。
她把塑膠袋放在靠門邊的那張空桌上,袋底落下去的時候發出輕微的響動。
「買了豆漿和包子,你們輪流過來吃,別一窩蜂擠著。」她說這話的時候聲音不大,但口齒清晰,每個字都送得到位。
然後她走到李軒身後,低頭看著他的屏幕。
她沒有出聲,就那麼站著,兩隻手插在外套口袋裡,目光落在屏幕上的代碼行間。
她看了一會兒,沒有提問,也沒有催。
她知道李軒在做什麼,知道他現在腦子裡正轉著什麼東西。
她就等著。
李軒沒有回頭看她,也沒有去碰那袋早飯。
他的手指在鍵盤上敲了幾下,光標在某一行代碼前面停下來,那一行用紅色高亮標著,是握手協議里確認信號的處理邏輯。
他把光標停在那個函數名上,開口說了句:「如果握手改成三次確認之後不做連接池預分配,改成動態申請的話,能不能解決握手階段的阻塞問題?不提前占坑,有請求來了再分配資源,握手階段就不會因為池子滿了卡死了吧?」
他旁邊坐的抱黑包的男生聽了,皺了皺眉,張了張嘴想說點什麼,但沒說出來。
他自己也在想這個問題,一時半會兒拿不準。
梁永琪聽完李軒的話,沒有急著表態。
她動作很自然地拿出手機,拇指在屏幕上按了幾下,把李軒剛才說的那段話精簡了一下,打了一行字發給陳浩。
發送成功的提示跳出來之後她把手機屏幕朝下扣在桌面邊緣,等著。
手機屏幕亮著,顯示收件人那一欄寫著「浩哥」,消息內容縮成一行小字,看不太清。
辦公室里又安靜下來。
李軒的手指懸在鍵盤上方沒落下去,他在等反饋。
梁永琪靠在桌邊,眼睛看著手機屏幕的方向。
大約過了兩分鐘,手機震了一下。
她翻過手機,點開簡訊,陳浩回過來的內容不長,就一行字,她看完之後把屏幕轉向李軒。
李軒湊過去看,屏幕上寫著:「動態申請會引入新的分配延遲,客戶端在握手確認後等待分配的那幾百毫秒里如果發來後續包,會被當作無效連接處理。
問題不在分配方式,在協議層的握手時序。」
李軒盯著這條回復看了兩遍。
他眉頭先是皺起來,眉心擠出一道豎紋,然後那道紋路又慢慢鬆開,像是腦子裡有什麼東西「啪」一下接通了。
他把手從鍵盤上抬起來,兩隻手搓了搓臉,搓到指腹壓著眼眶的時候停了一下,指頭按著眼皮,好像在讓眼球緩一緩。
他放下手,問:「那他有沒有說什麼方案?」
梁永琪又發了一條簡訊過去。
這回她打的是「握手時序怎麼改」。
她打字很快,拇指在屏幕上點了幾下就發出去了。
回信來得比剛才快,大概只隔了一分鐘,手機震了一下。
她點開,陳浩的回覆只有一句話:「把客戶端的第一個數據包從握手之後改到握手確認之前發,伺服器收到即認為連接有效。」
李軒看完這條,整個人頓住了。
他的目光停在屏幕上的那行字上,嘴裡無聲地動了幾個字,像是在把這句話拆開了嚼碎了往肚子裡咽。
他保持那個姿勢大概有五六秒,然後猛地轉過身面朝主控機,手指落在鍵盤上噼里啪啦地敲起來。
他敲得很快,幾乎沒停頓,一邊敲一邊說:「把握手確認之前的等待窗口去掉,客戶端在發第三次握手確認的時候同時帶第一個數據包,伺服器收到之後同時完成連接建立和數據接收。
這樣握手和首包合併成一個原子操作,連接池的占用時間縮短了三分之二。
原來一個連接從握手到建立要將近一秒鐘,現在壓縮到三百毫秒以內。
池子裡的連接轉得過來,後面排隊進來的就能接上了。」
他旁邊的短髮女生已經湊過來了,腦袋幾乎要貼上他的肩膀。
她盯著屏幕上正在改的代碼,眼睛眯起來。
「這樣改的話,首包丟了怎麼辦?客戶端發的確認裡帶了數據包,伺服器那邊沒收到的話,整個連接怎麼處理?」
「首包丟失客戶端重發握手確認,整個連接重建。
丟一次重建一次,跟原來的邏輯比多了一次重傳開銷,但丟包率本身不高,這個代價可以接受。」李軒敲完最後幾行,手指在回車鍵上用力按了一下,按下去的時候發出「啪」的一聲。
他按了保存,然後從椅子上站起來,走到那台主機的側面蹲下去,把側板掀開,用手電筒照著檢查了一下內存條的插接狀態。
他拔下來一根,用拇指擦了擦金手指,又重新插緊。
「先跑一遍單線程測試,過了再上並發。
你們別圍在這兒了,去吃早飯,包子該涼了。」
他說完這話,自己卻沒去拿包子。
他蹲在主機邊上,仰著頭看機箱裡的走線,一根一根地順著線捋過去,像是怕哪個接口鬆了影響測試結果。
其他幾個人慢慢動了。
抱黑包的男生把懷裡的包擱在桌上,走到門邊的桌子前拎了一隻塑膠袋回來,從裡面掏出一隻包子咬了一口,嚼了兩下,又拿起豆漿喝了一口。
豆漿已經不太燙了,溫的。
短髮女生也走過去拿了一隻包子,靠在桌邊慢慢吃,她吃得慢,一小口一小口地咬,眼睛還盯著李軒那邊的屏幕。
辦公室里瀰漫著包子的麵皮味和豆漿的豆腥氣。
有人吃了幾口之後打了個嗝,聲音不大,悶在嘴裡。
李軒檢查完機箱,把側板蓋上擰好螺絲,回到主控機前面坐下。
他點開剛才保存的代碼,重新編譯了一遍,編譯過了之後開始跑單線程測試。
屏幕上跳出來測試進度條,一格一格往前移。
梁永琪靠在門框邊上,抱著胳膊看著屋裡這些人。
她的視線從李軒的側臉移到那個吃包子的男生身上,又移到短髮女生身上,最後落回李軒的屏幕上。
她沒出聲,就那麼站著。
單線程測試跑完了,通過。
李軒深吸了一口氣,手指懸在鍵盤上方,停了兩三秒,然後開始調並發測試參數。
他把並發數從兩千三往上調,先調了兩千五,確認跑起來沒崩,又往上調到三千,還是沒崩,再調三千五。
測試跑起來之後,所有人都停了手裡的動作,目光往主控機的屏幕這邊聚過來。
時鐘一秒一秒地走,屏幕上顯示並發連接數穩定在三千五上下,伺服器響應時間沒有明顯波動,日誌里沒有再出現連接池溢出的報錯。
【跪求禮物,免費的為愛發電也行!】