最近碰到的一些伺服器問題的總結

2021-10-09 15:21:22 字數 2893 閱讀 6228

隨著業務的熟悉,也多出更多的時間在注意技術。碰到了一下問題,做一下記錄。

1.怎麼檢視伺服器當前的網路狀態,怎麼看socket是否斷開,怎麼檢視各個埠的連線情況。

使用netstat -na顯示當前網路各個埠連線資訊,會顯示各個連線的狀態(a所有,n顯示位址,可以加t指定tcp,l指定顯示監聽的套接字)。

2.linux fd(檔案描述符)復用時怎麼確保不出錯。

3.客戶端怎麼非同步的去連線伺服器。

使用多執行緒或者多程序去連線伺服器(執行緒池)

4.怎麼查詢乙個目錄和多個目錄下含有指定輸出的檔案

使用grep '***x' [目錄1] [目錄2] -rn,查詢目錄1,目錄2**現 『***x』 的檔案,並顯示出現在第幾行。

5.skynet 不小心再 for 迴圈中使用了 call,另乙個服務沒有處理,這種情況怎麼解決。

6.lua的table是怎麼實現的。

這個我還沒有看過,只知道 lua 的 table 是陣列和hash一起實現的。有乙個有意思的事情是,有乙個 table ,table[1000] = 1,這種情況下是陣列還是hash(雖然在我們看來是陣列,但是實際上卻是hash,簡單的想,如果是陣列也不實際,建立1000個位址,只存貯乙個位址)。table 的 取長度,會查詢乙個整形的key,達成條件

所以,如果中間含有nil的table,計算長度,會出錯。

7.怎麼判斷伺服器是否發生死迴圈。

top:找出占用cpu過高的程式

top -h -p:記錄下占用cpu的執行緒號

gdb attach 《程序號》: 對占用cpu過高的程式進行gdb除錯

info thread: 列出執行緒狀態

thread 《執行緒號》: 根據執行緒號切換到某個執行緒

bt: 輸出堆疊

l: 檢視當前**

print 《變數名》:輸出必要的變數內容

detach:分離執行緒

q 退出gdb除錯處理死迴圈,重啟程序/執行緒

8.怎麼檢視自己的伺服器到底能夠承載多少人。

檢視linux伺服器的記憶體,檢視乙個玩家需要多少記憶體,進行計算。

9.socket write的時候,對方如果關閉了,核心緩衝區又還沒滿,嘗試繼續寫會怎樣。

先寫入緩衝區,再寫得話會返回錯誤,觸發訊號。

10.動態庫靜態庫那個效率高。c++動態庫為什麼要宣告 extern c。呼叫動態庫的方法。

當程式與靜態庫連線時,庫中目標檔案所含的所有將被程式使用的函式的機器碼被 copy 到最終的可執行檔案中。這就會導致最終生成的可執行**量相對變多,相當於編譯器將**補充完整了,優點,這樣執行起來相對就快些。不過會有個缺點: 占用磁碟和記憶體空間. 靜態庫會被新增到和它連線的每個程式中, 而且這些程式執行時, 都會被載入到記憶體中. 無形中又多消耗了更多的記憶體空間。

與共享庫連線的可執行檔案只包含它需要的函式的引用表,而不是所有的函式**,只有在程式執行時, 那些需要的函式**才被拷貝到記憶體中。優點,這樣就使可執行檔案比較小, 節省磁碟空間,更進一步,作業系統使用虛擬記憶體,使得乙份共享庫駐留在記憶體中被多個程式使用,也同時節約了記憶體。缺點,不過由於執行時要去鏈結庫會花費一定的時間,執行速度相對會慢一些,總的來說靜態庫是犧牲了空間效率,換取了時間效率,共享庫是犧牲了時間效率換取了空間效率,沒有好與壞的區別,只看具體需要了。

另外,乙個程式編好後,有時需要做一些修改和優化,如果我們要修改的剛好是庫函式的話,在介面不變的前提下,使用共享庫的程式只需要將共享庫重新編譯就可以了,而使用靜態庫的程式則需要將靜態庫重新編譯好後,將程式再重新編譯一便。這也是使用過程當中的差別,以現在的專案舉例,在遠端更新的時候,如果只是*.so動態庫封裝內容變化了,那麼只需要更新*.so即可。

被extern "c"修飾的變數和函式是按照c語言方式進行編譯和鏈結的

11.skynet 使用的 epoll是什麼模式,epoll 的水平觸發和邊緣觸發有什麼區別

水平觸發(level_triggered,epoll預設是水平觸發的,skynet沒做修改。

水平觸發(level_triggered:對於socket讀來說,檔案描述符關聯的讀核心緩衝區非空,有資料可以讀取,就會觸發讀就緒,對於socket寫來說,描述符關聯的核心寫緩衝區不滿,就可以觸發寫就緒。

邊緣觸發(edge_triggered):對於socket讀來說,一旦有訊息達到,觸發一次讀就緒,如果一次沒有讀完緩衝區,則剩餘的訊息將會留在緩衝區,不會觸發讀就緒。對於socket寫來說,只觸發一次寫就緒,如果寫滿了緩衝區,當緩衝區傳送完畢時,會再觸發一次寫就緒。如果未滿,則也不會觸發寫就緒。

12.c++虛函式怎麼實現的。

帶有虛函式的類,編譯器會為其額外分配乙個虛函式表,裡面記錄的使虛函式的位址,當此類被繼承時,子類如果也寫了虛函式就在子類的虛函式表中將父類的函式位址覆蓋,否則繼承父類的虛函式位址。

例項化之後,物件有乙個虛函式指標,虛函式指標指向虛函式表,這樣程式執行的時候,通過虛函式指標找到的虛函式表就是根據物件的型別來指向的了。

13.skynet定時器是怎麼實現的。

最近的一些總結

剛剛換了公司,很驚喜,竟然得到老趙的青睞,所以最近特別努力。除了每天在公司裡努力著學習著,到家裡還繼續看書 寫 希望自己能多學點,多用點。近期一直在看exception handling,自己英文不是很好,但還是看著國外的一些資料,慢慢的覺得英文好了起來,基本能看懂,不過還不太會說,以後要學習了。這...

GO伺服器後端碰到的問題

這裡記錄一下cros問題 需要在服務端加入以下 w.header add access control allow origin w.header add access control allow methodas get,post,options w.header add access contr...

最近的一些總結20180922

1.關於c vs2015配置boost 1 68 0 參考了網上的一些步驟,和隊友成功安裝了,這裡是乙份簡單總結 需要安裝的boost最好是較大的那個壓縮包,小的那個沒安裝,但是最好還是用大的那個 解壓之後需要先安裝,先用cmd執行bootstrap.bat檔案,bat檔案在我的電腦裡顯示的是win...