看板 NCUT-IM 關於我們 聯絡資訊
※ [本文轉錄自 u39132003 信箱] 作者: MichaelHsin (BBS之蟲) 站內: Gossiping 標題: Re: [討論] PTT七萬人了....@@ 時間: Mon Jun 4 02:27:31 2007 ※ 引述《tonyhome (運功療傷OGC)》之銘言: : 理想來說 : 一個server最多只有65536個port : 也就是說最多只能開放65536個人連線到ptt : 很好奇ptt是怎麼容納這麼多人的??? : 難道ptt有兩個server??? : 還是有其他技術??? 沒有,因為一個 port 23 就可以服務很多人... 在 TCP spec 來看,理論上一個 port 可以接的 connection 是無上限, 但事實上每多接一個 connection,kernel 就得多吃掉一些資源來 maintain, 然後還有 userland 這邊會吃掉的資源,所以實際上當然會有上限,但這個限制不是 TCP spec 給的。 : → tonyhome:只要是TCP 就會有一個listening port等待client的request 06/03 23:09 : → tonyhome:並且指派另外一個connection port維持server和client的 06/03 23:10 : → tonyhome:連線狀態 偶臭了嗎???偶臭了嗎???偶臭了嗎???偶臭了嗎??? 06/03 23:10 錯了,listening 到 accept 接起來的 port 當然都不會變。 我想你是跟 socket lib 的 socket descriptor 搞混了吧。 用 socket() 建出來的 fd,bind(), listen() 之後,accept() 接下一個 connection 時的確會給你一個新的 fd 代表這一個 connection,原本的 fd 繼續拿去 accept()。 但這是 socket lib 的機制,fd 變了,connection 連的 port 還是一樣。 複習一下 TCP connection establishment(也就是 three-way handshaking)吧。 --- 怎麼辦,這篇好像會被鄉民說沒八卦耶。 那來個八卦: 在很久很久以前,大約 1998 年或更早的時候,很多比較大的 BBS 站都遇到了總註冊 人數(不是同時上線人數喔)到了三萬多就上不去的問題,只好靠著砍很久沒上站的人 或乾脆停止註冊撐著, 原因是,這些站都遇到一個限制:子目錄數的上限 32767。 在發生這件事之前,每註冊一個使用者,系統都會開一個目錄 ~bbs/home/username 來 放那個使用者的信件、簽名檔, etc.,但是一般檔案系統的子目錄數是有上限的。 (接下來這段看不懂就跳過吧) 我們都知道(真的嗎? XD)vfs 裡面每個 inode 都有個 link count,當它減為零時 代表可以被真正刪除把空間釋放出來,而每個目錄剛建立時 link count 就是 2(上層 指向它一個,它裡面的 . 又一個),在它裡面多建一個子目錄又會加一(因為它的子 目錄裡有一個 .. 指向它),所以有 n 個子目錄 link count 就是 n+1(. 也當作子 目錄)。而 FreeBSD UFS/FFS 的 link count 欄位只有 15 個 bit,也就是最大值只 能到 32767。 而目錄裡的檔案並不會有 link 指回上層,所以理論上是無上限的。 當然,一個目錄裡的檔案或子目錄太多時,存取時間就會上升,所以一般(沒有 directory hash 的時候)放了幾萬個檔案你就會受不了了。 (技術細節結束) 怎麼解決呢? 很簡單,就多開一層,~bbs/home/A/ 放 A 開頭的使用者,~/bbs/home/B/ 放 B 開頭 的,依此類推。 但是說的簡單,當初 BBS 的 code 裡面直接寫死 access user home dir 的 code 到 處散佈,bbs 主程式裡面可能就有好幾個地方要改,utils 裡面又各寫各的,於是苦命 的站長們就只好一一去翻出來改好 XD 就這樣,大家又可以繼續註冊過著幸福(?)快樂(?)的日子了。 -- 我覆蓋一張好人卡,結束這個回合 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.55
Assyla:不過註冊問題其實都沒啥在關心了吧,真正大的站就那幾個 06/04 02:31
Assyla:小站的人數不斷流失,加上很多年輕人比較喜歡網頁介面 06/04 02:32
MichaelHsin:我說的是 1998 年以前的事了啊 XD 06/04 02:33
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.224.47.171