linux系統json的簡單介紹

本文目錄一覽:

如何在linux中使用命令行解析json文檔

開始 – 運行-CMD 在命令提示符下,輸入(引號裡面的內容) “副教授的exe = exefile”。 然後輸入: “。assoc命令將DLL = dllfile”輸入 然後輸入: “。assoc命令LNK = lnkfile”輸入 記事本

怎麼在linux里安裝json

1, 下載php-json-ext-1.2.1.tar.bz2, 這個不好下載,按網上的地址很多不能下載,後來終於找到一個

2,解壓縮 #tar xvjf php-json-ext-1.2.1.tar.bz2

3, 進源碼目錄#cd php-json-ext-1.2.1

4、準備編譯環境。這一步可以先不做直接進行第5步操作,如果遇到問題後再進行本步檢查也無所謂。不過為了避免不必要的麻煩,我們還是檢查下編譯環境是否準備好了吧!

#yum install php-devel automake autoconf libtool gcc

5、準備PHP模塊的編譯環境:

#phpize

6、開始編譯json模塊:

#./configure

#make

#make install

7、配置php.ini。首先打開php.ini文件:

Linux json文件(排序|去重)

文件 test.log json文件數據

根據 data.ext.uid 字段排序

使用 jq 去重數據,並只顯示 data.ext.uid 字段

多維度去重

Linux Shell格式化Json

Linux下查看格式化輸出json

使用json在線解析可以解決問題

其實Linux下有現成的工具可以很好的顯示

1.直接以文本形式展現

輸入

回車顯示結果

2.如果json保存在文件里比如

可以使用

即可格式化查看json如圖

我們平常使用curl測試返回的數據也可以這樣格式化輸出

編寫Shell腳本

保存為文件abc.sh

比較清晰了

這也算是平時積累的小技巧

怎樣用linux創建json文件

所謂json文件,只是符合json格式的文本文件而已(就像xml文件一樣),直接創建普通文件,裡面的內容寫成json的格式即可。

關於 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為全連接隊列當前使用了多少。 中文資料里這個問題講得最明白的文章:

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

原創文章,作者:QUWH,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/136878.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
QUWH的頭像QUWH
上一篇 2024-10-04 00:16
下一篇 2024-10-04 00:16

相關推薦

  • Deepin系統分區設置教程

    本教程將會詳細介紹Deepin系統如何進行分區設置,分享多種方式讓您了解如何規劃您的硬盤。 一、分區的基本知識 在進行Deepin系統分區設置之前,我們需要了解一些基本分區概念。 …

    編程 2025-04-29
  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 如何在樹莓派上安裝Windows 7系統?

    隨着樹莓派的普及,許多用戶想在樹莓派上安裝Windows 7操作系統。 一、準備工作 在開始之前,需要準備以下材料: 1.樹莓派4B一台; 2.一張8GB以上的SD卡; 3.下載並…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的“畫筆”在窗口中繪製…

    編程 2025-04-29
  • JSON的MD5

    在Web開發過程中,JSON(JavaScript Object Notation)是最常用的數據格式之一。MD5(Message-Digest Algorithm 5)是一種常用…

    編程 2025-04-29
  • 使用Java將JSON寫入HDFS

    本篇文章將從以下幾個方面詳細闡述Java將JSON寫入HDFS的方法: 一、HDFS簡介 首先,先來了解一下Hadoop分布式文件系統(HDFS)。HDFS是一個可擴展性高的分布式…

    編程 2025-04-29
  • 分銷系統開發搭建

    本文主要介紹如何搭建一套完整的分銷系統,從需求分析、技術選型、開發、部署等方面進行說明。 一、需求分析 在進行分銷系統的開發之前,我們首先需要對系統進行需求分析。一般來說,分銷系統…

    編程 2025-04-29
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28

發表回復

登錄後才能評論