導航:首頁 > 編程系統 > linux查看棧

linux查看棧

發布時間:2023-08-17 00:52:46

linux 查看文件被哪個進程打開

可以使用:ps
-fe|grep
filename,
也可以使用:fuser
filename查看
然後可以看這個進程跟哪裡東西有關聯,使用了哪些埠
只查看該進程:ps
-ef
|
grep
ID
查看該進程打開的文件:lsof
-p
ID
查看內存分配:lcat
/proc/ID/maps
查看堆棧:pstack
11ID
查看發出的系統調用:strace
-p
ID
查看調用庫函數:ltrace
-p
ID

⑵ 關於 Linux 網路,你必須知道這些

我們一起學習了文件系統和磁碟 I/O 的工作原理,以及相應的性能分析和優化方法。接下來,我們將進入下一個重要模塊—— Linux 的網路子系統。

由於網路處理的流程最復雜,跟我們前面講到的進程調度、中斷處理、內存管理以及 I/O 等都密不可分,所以,我把網路模塊作為最後一個資源模塊來講解。

同 CPU、內存以及 I/O 一樣,網路也是 Linux 系統最核心的功能。網路是一種把不同計算機或網路設備連接到一起的技術,它本質上是一種進程間通信方式,特別是跨系統的進程間通信,必須要通過網路才能進行。隨著高並發、分布式、雲計算、微服務等技術的普及,網路的性能也變得越來越重要。

說到網路,我想你肯定經常提起七層負載均衡、四層負載均衡,或者三層設備、二層設備等等。那麼,這里說的二層、三層、四層、七層又都是什麼意思呢?

實際上,這些層都來自國際標准化組織制定的開放式系統互聯通信參考模型(Open System Interconnection Reference Model),簡稱為 OSI 網路模型。

但是 OSI 模型還是太復雜了,也沒能提供一個可實現的方法。所以,在 Linux 中,我們實際上使用的是另一個更實用的四層模型,即 TCP/IP 網路模型。

TCP/IP 模型,把網路互聯的框架分為應用層、傳輸層、網路層、網路介面層等四層,其中,

為了幫你更形象理解 TCP/IP 與 OSI 模型的關系,我畫了一張圖,如下所示:

當然了,雖說 Linux 實際按照 TCP/IP 模型,實現了網路協議棧,但在平時的學習交流中,我們習慣上還是用 OSI 七層模型來描述。比如,說到七層和四層負載均衡,對應的分別是 OSI 模型中的應用層和傳輸層(而它們對應到 TCP/IP 模型中,實際上是四層和三層)。

OSI引入了服務、介面、協議、分層的概念,TCP/IP借鑒了OSI的這些概念建立TCP/IP模型。

OSI先有模型,後有協議,先有標准,後進行實踐;而TCP/IP則相反,先有協議和應用再提出了模型,且是參照的OSI模型。

OSI是一種理論下的模型,而TCP/IP已被廣泛使用,成為網路互聯事實上的標准。

有了 TCP/IP 模型後,在進行網路傳輸時,數據包就會按照協議棧,對上一層發來的數據進行逐層處理;然後封裝上該層的協議頭,再發送給下一層。

當然,網路包在每一層的處理邏輯,都取決於各層採用的網路協議。比如在應用層,一個提供 REST API 的應用,可以使用 HTTP 協議,把它需要傳輸的 JSON 數據封裝到 HTTP 協議中,然後向下傳遞給 TCP 層。

而封裝做的事情就很簡單了,只是在原來的負載前後,增加固定格式的元數據,原始的負載數據並不會被修改。

比如,以通過 TCP 協議通信的網路包為例,通過下面這張圖,我們可以看到,應用程序數據在每個層的封裝格式。

這些新增的頭部和尾部,增加了網路包的大小,但我們都知道,物理鏈路中並不能傳輸任意大小的數據包。網路介面配置的最大傳輸單元(MTU),就規定了最大的 IP 包大小。在我們最常用的乙太網中,MTU 默認值是 1500(這也是 Linux 的默認值)。

一旦網路包超過 MTU 的大小,就會在網路層分片,以保證分片後的 IP 包不大於 MTU 值。顯然,MTU 越大,需要的分包也就越少,自然,網路吞吐能力就越好。

理解了 TCP/IP 網路模型和網路包的封裝原理後,你很容易能想到,Linux 內核中的網路棧,其實也類似於 TCP/IP 的四層結構。如下圖所示,就是 Linux 通用 IP 網路棧的示意圖:

我們從上到下來看這個網路棧,你可以發現,

這里我簡單說一下網卡。網卡是發送和接收網路包的基本設備。在系統啟動過程中,網卡通過內核中的網卡驅動程序注冊到系統中。而在網路收發過程中,內核通過中斷跟網卡進行交互。

再結合前面提到的 Linux 網路棧,可以看出,網路包的處理非常復雜。所以,網卡硬中斷只處理最核心的網卡數據讀取或發送,而協議棧中的大部分邏輯,都會放到軟中斷中處理。

我們先來看網路包的接收流程。

當一個網路幀到達網卡後,網卡會通過 DMA 方式,把這個網路包放到收包隊列中;然後通過硬中斷,告訴中斷處理程序已經收到了網路包。

接著,網卡中斷處理程序會為網路幀分配內核數據結構(sk_buff),並將其拷貝到 sk_buff 緩沖區中;然後再通過軟中斷,通知內核收到了新的網路幀。

接下來,內核協議棧從緩沖區中取出網路幀,並通過網路協議棧,從下到上逐層處理這個網路幀。比如,

最後,應用程序就可以使用 Socket 介面,讀取到新接收到的數據了。

為了更清晰表示這個流程,我畫了一張圖,這張圖的左半部分表示接收流程,而圖中的粉色箭頭則表示網路包的處理路徑。

了解網路包的接收流程後,就很容易理解網路包的發送流程。網路包的發送流程就是上圖的右半部分,很容易發現,網路包的發送方向,正好跟接收方向相反。

首先,應用程序調用 Socket API(比如 sendmsg)發送網路包。

由於這是一個系統調用,所以會陷入到內核態的套接字層中。套接字層會把數據包放到 Socket 發送緩沖區中。

接下來,網路協議棧從 Socket 發送緩沖區中,取出數據包;再按照 TCP/IP 棧,從上到下逐層處理。比如,傳輸層和網路層,分別為其增加 TCP 頭和 IP 頭,執行路由查找確認下一跳的 IP,並按照 MTU 大小進行分片。

分片後的網路包,再送到網路介面層,進行物理地址定址,以找到下一跳的 MAC 地址。然後添加幀頭和幀尾,放到發包隊列中。這一切完成後,會有軟中斷通知驅動程序:發包隊列中有新的網路幀需要發送。

最後,驅動程序通過 DMA ,從發包隊列中讀出網路幀,並通過物理網卡把它發送出去。

多台伺服器通過網卡、交換機、路由器等網路設備連接到一起,構成了相互連接的網路。由於網路設備的異構性和網路協議的復雜性,國際標准化組織定義了一個七層的 OSI 網路模型,但是這個模型過於復雜,實際工作中的事實標准,是更為實用的 TCP/IP 模型。

TCP/IP 模型,把網路互聯的框架,分為應用層、傳輸層、網路層、網路介面層等四層,這也是 Linux 網路棧最核心的構成部分。

我結合網路上查閱的資料和文章中的內容,總結了下網卡收發報文的過程,不知道是否正確:

當發送數據包時,與上述相反。鏈路層將數據包封裝完畢後,放入網卡的DMA緩沖區,並調用系統硬中斷,通知網卡從緩沖區讀取並發送數據。

了解 Linux 網路的基本原理和收發流程後,你肯定迫不及待想知道,如何去觀察網路的性能情況。具體而言,哪些指標可以用來衡量 Linux 的網路性能呢?

實際上,我們通常用帶寬、吞吐量、延時、PPS(Packet Per Second)等指標衡量網路的性能。

除了這些指標,網路的可用性(網路能否正常通信)、並發連接數(TCP 連接數量)、丟包率(丟包百分比)、重傳率(重新傳輸的網路包比例)等也是常用的性能指標。

分析網路問題的第一步,通常是查看網路介面的配置和狀態。你可以使用 ifconfig 或者 ip 命令,來查看網路的配置。我個人更推薦使用 ip 工具,因為它提供了更豐富的功能和更易用的介面。

以網路介面 eth0 為例,你可以運行下面的兩個命令,查看它的配置和狀態:

你可以看到,ifconfig 和 ip 命令輸出的指標基本相同,只是顯示格式略微不同。比如,它們都包括了網路介面的狀態標志、MTU 大小、IP、子網、MAC 地址以及網路包收發的統計信息。

第一,網路介面的狀態標志。ifconfig 輸出中的 RUNNING ,或 ip 輸出中的 LOWER_UP ,都表示物理網路是連通的,即網卡已經連接到了交換機或者路由器中。如果你看不到它們,通常表示網線被拔掉了。

第二,MTU 的大小。MTU 默認大小是 1500,根據網路架構的不同(比如是否使用了 VXLAN 等疊加網路),你可能需要調大或者調小 MTU 的數值。

第三,網路介面的 IP 地址、子網以及 MAC 地址。這些都是保障網路功能正常工作所必需的,你需要確保配置正確。

第四,網路收發的位元組數、包數、錯誤數以及丟包情況,特別是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指標不為 0 時,通常表示出現了網路 I/O 問題。其中:

ifconfig 和 ip 只顯示了網路介面收發數據包的統計信息,但在實際的性能問題中,網路協議棧中的統計信息,我們也必須關注。你可以用 netstat 或者 ss ,來查看套接字、網路棧、網路介面以及路由表的信息。

我個人更推薦,使用 ss 來查詢網路的連接信息,因為它比 netstat 提供了更好的性能(速度更快)。

比如,你可以執行下面的命令,查詢套接字信息:

netstat 和 ss 的輸出也是類似的,都展示了套接字的狀態、接收隊列、發送隊列、本地地址、遠端地址、進程 PID 和進程名稱等。

其中,接收隊列(Recv-Q)和發送隊列(Send-Q)需要你特別關注,它們通常應該是 0。當你發現它們不是 0 時,說明有網路包的堆積發生。當然還要注意,在不同套接字狀態下,它們的含義不同。

當套接字處於連接狀態(Established)時,

當套接字處於監聽狀態(Listening)時,

所謂全連接,是指伺服器收到了客戶端的 ACK,完成了 TCP 三次握手,然後就會把這個連接挪到全連接隊列中。這些全連接中的套接字,還需要被 accept() 系統調用取走,伺服器才可以開始真正處理客戶端的請求。

與全連接隊列相對應的,還有一個半連接隊列。所謂半連接是指還沒有完成 TCP 三次握手的連接,連接只進行了一半。伺服器收到了客戶端的 SYN 包後,就會把這個連接放到半連接隊列中,然後再向客戶端發送 SYN+ACK 包。

類似的,使用 netstat 或 ss ,也可以查看協議棧的信息:

這些協議棧的統計信息都很直觀。ss 只顯示已經連接、關閉、孤兒套接字等簡要統計,而 netstat 則提供的是更詳細的網路協議棧信息。

比如,上面 netstat 的輸出示例,就展示了 TCP 協議的主動連接、被動連接、失敗重試、發送和接收的分段數量等各種信息。

接下來,我們再來看看,如何查看系統當前的網路吞吐量和 PPS。在這里,我推薦使用我們的老朋友 sar,在前面的 CPU、內存和 I/O 模塊中,我們已經多次用到它。

給 sar 增加 -n 參數就可以查看網路的統計信息,比如網路介面(DEV)、網路介面錯誤(EDEV)、TCP、UDP、ICMP 等等。執行下面的命令,你就可以得到網路介面統計信息:

這兒輸出的指標比較多,我來簡單解釋下它們的含義。

其中,Bandwidth 可以用 ethtool 來查詢,它的單位通常是 Gb/s 或者 Mb/s,不過注意這里小寫字母 b ,表示比特而不是位元組。我們通常提到的千兆網卡、萬兆網卡等,單位也都是比特。如下你可以看到,我的 eth0 網卡就是一個千兆網卡:

其中,Bandwidth 可以用 ethtool 來查詢,它的單位通常是 Gb/s 或者 Mb/s,不過注意這里小寫字母 b ,表示比特而不是位元組。我們通常提到的千兆網卡、萬兆網卡等,單位也都是比特。如下你可以看到,我的 eth0 網卡就是一個千兆網卡:

我們通常使用帶寬、吞吐量、延時等指標,來衡量網路的性能;相應的,你可以用 ifconfig、netstat、ss、sar、ping 等工具,來查看這些網路的性能指標。

小狗同學問到: 老師,您好 ss —lntp 這個 當session處於listening中 rec-q 確定是 syn的backlog嗎?
A: Recv-Q為全連接隊列當前使用了多少。 中文資料里這個問題講得最明白的文章: https://mp.weixin.qq.com/s/yH3PzGEFopbpA-jw4MythQ

看了源碼發現,這個地方講的有問題.關於ss輸出中listen狀態套接字的Recv-Q表示全連接隊列當前使用了多少,也就是全連接隊列的當前長度,而Send-Q表示全連接隊列的最大長度

⑶ linux用戶態棧空間的大小有沒有限制

當然有限制,你可以使用命令 ulimit -s 查看大小。
因為物理空間存在著大小限制,因此棧空間肯定也是有大小限制的,不然程序還不崩了。
甚至,你可以測試一下,分配一個超大的棧空間(方法是,在函數中,定義一個超大空間的數組),然後看是否可以運行,當達到一個限制的時候,程序是無法正常運行的

⑷ linux 怎麼查看segmentation fault堆棧

gdb ExeName
(gdb)core core.xx
(gdb)bt

core mp 一般是在segmentation fault(段來錯誤)的情源況下產生的文件,需要通過ulimit來設置才會得到的。關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html.

⑸ linux 怎麼分析core文件

從接觸unix開始就一直聽到和遇到core mp,特別是剛學著使用C語言在AIX下編寫程序的時候, mp更是時不時就會不請自來。記得當時剛寫應用的時候,提交程序時最怕的就是在運行過程時遇到core mp,對於銀行核心系統,特別是使用靜態應用進程,如果一個相對頻繁一點的交易導致core mp,那麼毫無疑問,除了趕緊定位錯誤改程序外,重啟進程甚至無法爭取到多少緩沖的時間來進行代碼的更正和測試。而且往往導致core mp的,就是程序中一個小小的未注意到或者未測試到的一個疏忽。

雖然常常遇到core mp,不過很長時間內,都是出於知道這個名字,知道它導致的後果,知道一部分導致它出現的原因,其他的就都不甚了了了。說起來,就是自己太懶了,懶得看書......少壯不努力啊。看過一則統計,說60歲以上的老人,超過70%都後悔少壯不努力,不知統計的數據能否反映整個社會的情況。不過總的來說,這句古話還是有些道理的。大家不要學我。哈哈

core mp,翻譯過來講,就是核心轉儲。大致上就是指,如果由於應用錯誤,如浮點異常、指令異常等,操作系統將會轉入內核的異常處理,向對應的進程發送特定的信號(SIGNAL),如果進程中沒有對這些信號進行處理,就會轉入默認的處理,core mp就是其中的一種。如果進程core mp,系統將會終止該進程,同時系統會產生core文件,以供調試使用。這個core文件其實就是內存的映像,即進程執行的時候內存的內容,也就是所謂的core mp。平常大家說某某進程core mp了,其實主要的意思就是說:某某進程因為錯誤而被系統自動終止了。

AIX上提供了dbx工具可以對core mp進行調試,協助定位引起core mp的代碼。最普通的語法是:
dbx 應用名 core文件, 然後使用where命令來顯示調試信息
一般來講,根據工作中遇到的情況,dbx還是能夠比較輕松的根據提示的內容來定位代碼的。不過也有一些特殊情況時,dbx顯示的調試信息過於模糊或者不直觀,這個時候就只能根據經驗來逐步定位了。有時定位起來會耗用相當長的時間。遇到這種情況時,使用日誌文件,通過在代碼中穿插多個寫log的語句,也可以協助發現。因為進程core mp時,日誌當然也中斷了,根據日誌在哪個代碼行之後或之前中止了,可以有效縮小尋找的范圍。甚至,在有些情況下,使用日誌定位是唯一簡便的方法了。

⑹ 1 linux下調試core的命令,察看堆棧狀態命令

比方說,你要調試的core文件是 core.xxx,原始可執行文件是 a.exe

先用 gdb a.exe 進入 gdb,在gdb命令行下 執行

core-file /path/to/core.xxx
然後專即可調試core mp文件了,比如用 bt 等屬

⑺ linux ps命令顯示一個特定的進程信息,如下說明

ps

ps(即進程狀態)命令用於提供有關當前正在運行的進程的信息,包括其進程標識號(PID)。

進程,也稱為任務,是程序的執行(即,運行)實例。系統為每個進程分配一個唯一的PID。

ps的基本語法是

ps [options]

當沒有任何選項使用ps時,它會發送到標准輸出,默認情況下是顯示監視器,系統上當前至少有兩個進程的四項信息:shell和ps。shell是一個程序,它在類Unix操作系統中提供傳統的純文本用戶界面,用於發出命令並與系統交互,默認情況下在Linux上是bash。ps本身是一個進程,一旦顯示輸出它就會死掉(即終止)。

使用ps獲取有關系統當前進程的更完整信息的常用方便方法是使用以下方法:

ps -aux | less

ps顯示的進程可以限制為屬於任何給定用戶的進程,方法是通過grep(一種用於搜索文本的過濾器)輸出輸出。例如,屬於具有用戶名adam的用戶的進程可以使用以下內容顯示:

ps -ef | grep adam

Linux 下 取進程佔用 cpu 最高的前10個進程

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head

linux 下 取進程佔用內存(MEM)最高的前10個進程

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head

其中rsz是是實際內存

$ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'
$ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep oracle | sort -nrk5

其中rsz為實際內存,上例實現按內存排序,由大到小

5個命令檢查Linux中內存使用情況,含PS

⑻ linux 設置堆棧大小 為無限制

在來/etc/profile 的最後面添加ulimit -s unlimited 保存源,source /etc/profile使修改文件生效

linux查看修改線程默認棧空間大小 :ulimit -s
1、通過命令 ulimit -s 查看linux的默認棧空間大小,默認情況下 為10240 即10M
2、通過命令 ulimit -s 設置大小值 臨時改變棧空間大小:ulimit -s 102400, 即修改為100M
3、可以在/etc/rc.local 內 加入 ulimit -s 102400 則可以開機就設置棧空間大小
4、在/etc/security/limits.conf 中也可以改變棧空間大小:
#<domain> <type> <item> <value>
* soft stack 102400
重新登錄,執行ulimit -s 即可看到改為102400 即100M

閱讀全文

與linux查看棧相關的資料

熱點內容
一直生成photo文件夾 瀏覽:14
為什麼編程語言都是world 瀏覽:489
輕顏相機在手機里的哪個文件夾 瀏覽:547
王者什麼時候版本更新 瀏覽:123
win10桌面圖標太小亂跑 瀏覽:73
寫公文時保密數據如何反映 瀏覽:767
arch設置ip配置文件 瀏覽:641
燒杯APP中的氣體和液體在哪裡 瀏覽:3
找同行工作在哪個網站 瀏覽:254
linuxdirfd 瀏覽:290
電腦列印一張文件多少錢 瀏覽:212
斗戰神遊戲修復工具 瀏覽:736
系統更新網路無法鏈接不上電腦沒反應 瀏覽:851
什麼是二層網路架構 瀏覽:402
中醫看書好的app 瀏覽:516
win10紙牌變成英文 瀏覽:135
源碼文件圖片路徑怎麼形成的 瀏覽:432
ai變數寬度配置文件點不了 瀏覽:460
強制安裝app去哪裡舉報 瀏覽:719
微信登錄數據保存在哪裡 瀏覽:321

友情鏈接