1. 程式人生 > 其它 >Linux命令拾遺-檢視系統資訊

Linux命令拾遺-檢視系統資訊

原創:打碼日記(微信公眾號ID:codelogs),歡迎分享,轉載請保留出處。

簡介

作為一名程式設計師,有時需要關注自己的程序執行在什麼樣的軟硬體環境裡,比如幾核cpu、固態硬碟還是機械硬碟、核心版本多少、Centos還是Ubuntu?

檢視硬體資訊

Linux裡面提供了一系列命令用來檢視系統硬體資訊,如lscpu、lsblk、lshw等,如下:

檢視cpu資訊

lscpu命令可以檢視cpu資訊,如下:

$ lscpu
Architecture:                    x86_64                                        #指令集架構,pc一般是x86_64,手機一般是arm64
CPU op-mode(s):                  32-bit, 64-bit                                #支援32位、64位執行模式
Byte Order:                      Little Endian                                 #小端位元組序
Address sizes:                   39 bits physical, 48 bits virtual             # 39位實體地址,48位虛擬地址
CPU(s):                          8                                             # 8個邏輯核
On-line CPU(s) list:             0-7                                           # 8核都線上
Thread(s) per core:              2                                             # 每個核兩個硬體執行緒(Intel超執行緒技術)
Core(s) per socket:              4                                             # 每個cpu有4個核
Socket(s):                       1                                             # 1個cpu
Vendor ID:                       GenuineIntel                                  # intel的cpu
CPU family:                      6                                             # cpu產品系列
Model:                           142                                           # cpu產品型號
Model name:                      Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz      # cpu產品型號
Stepping:                        10                                            # 此型號的每10代
CPU MHz:                         1991.998                                      # cpu主頻
BogoMIPS:                        3983.99
Hypervisor vendor:               Microsoft                                     # 虛擬化廠商Microsoft,因為我是在WSL中執行的lscpu
Virtualization type:             full                                          # 虛擬化型別,full表示全虛擬化
L1d cache:                       128 KiB                                       # 一級資料快取大小
L1i cache:                       128 KiB                                       # 一級指令快取大小
L2 cache:                        1 MiB                                         # 二級快取大小
L3 cache:                        8 MiB                                         # 三級快取大小

可以看到,lscpu能檢視cpu的各種詳細資訊,這裡面需要重點理解的是邏輯核與物理核的概念,如果一個機器上有2個4核8執行緒的CPU,那麼它的邏輯核數是16,物理核數是8,而從作業系統的視角來看,它會認為當前機器有16個CPU。

另外,如果lscpu不可用,也可以使用/proc/cpuinfo檢視,如下:

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 142
model name      : Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
stepping        : 10
microcode       : 0xffffffff
cpu MHz         : 1991.998
cache size      : 8192 KB
physical id     : 0
siblings        : 8
core id         : 0
cpu cores       : 4
...

檢視磁碟資訊

使用lsblk可以很容易的看到機器上的磁碟與分割槽情況,如下:

$ lsblk -p 
/dev/sda      8:0    0   280G  0 disk
└─/dev/sda1   8:1    0   280G  0 part /

可以看到當前機器只有一個磁碟,大小是280G,它被虛擬成了/dev/sda檔案,而磁碟/dev/sda只有1個分割槽,它被虛擬成了/dev/sda1檔案,這裡又印證了Unix"一切皆檔案"的設計哲學,硬碟與分割槽都被虛擬成了檔案!

相信你也發現了一些Linux磁碟命名的規律,如果有3個磁碟,命名就是sda、sdb、sdc,如果sda有3個分割槽,分割槽名就是sda1、sda2、sda3,以此類推。

fdisk也可以用來檢視磁碟資訊,如下:

$ sudo fdisk -l 
Disk /dev/sda: 280 GiB, 300647710720 bytes, 587202560 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd36fd4dd

Device     Boot Start       End   Sectors  Size Id Type
/dev/sda1  *     2048 587202559 587200512  280G 83 Linux

Disk /dev/sda1: 279.102 GiB, 300646662144 bytes, 587200512 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

還有一個常見場景是檢視硬碟型別,比如:

  • 當前磁碟是機械硬碟還是SSD?
  • 如果是SSD的話,它是SATA SSD還是PCIe SSD

對於這3種不同型別的磁碟,它們之間的效能差異巨大,區分方法如下:

$ lsblk -o name,size,type,rota /dev/sda
NAME    SIZE TYPE ROTA
sda     280G disk    1  # ROTA代表是否旋轉磁碟,所以1代表機械硬碟,0代表固態硬碟
└─sda1  280G part    1

# 執行下面兩條命令,就可以區分是SATA SSD還是PCIe SSD了,一般來說,PCIe SSD效能較好
$ lspci -vmm|grep -iE 'SATA|AHCI'
$ lspci -vmm|grep -iE 'PCIe|NVMe'

另外,下面這些命令也可以檢視磁碟相關資訊,一般需要自行安裝,如下:

# 檢視scsi磁碟裝置
$ lsscsi
# 檢視磁碟詳細資訊
$ sudo smartctl --info /dev/sda
$ sudo hdparm -I /dev/sda

檢視網絡卡資訊

使用ethtool可以檢視網絡卡的一些硬體引數,如下:

# 檢視網絡卡引數,會輸出好多看不懂的內容,應用層開發一般關注speed/duplex/link就可以了
$ sudo ethtool eth0
Settings for eth0:
    Supported ports: [ TP ]
    Supported pause frame use: No
    Supports auto-negotiation: Yes
    Advertised pause frame use: No
    Advertised auto-negotiation: Yes
    Advertised FEC modes: Not reported
    Speed: 1000Mb/s                        # 網絡卡速率
    Duplex: Full                           # 全雙工網絡卡
    Port: Twisted Pair
    PHYAD: 0
    Transceiver: internal
    Auto-negotiation: on
    MDI-X: off (auto)
    Supports Wake-on: d
    Wake-on: d
    Link detected: yes                     # 網絡卡連了網線

# 檢視網絡卡資料包統計資訊,關注drop/error之類的指標,這代表網絡卡層是否有丟包或錯誤產生
$ sudo ethtool -S eth0

# 檢視網絡卡RingBuffer大小
$ sudo ethtool -g eth0 
# 設定網絡卡RingBuffer大小
$ sudo ethtool -G eth0 rx 2048

# 使eth0網絡卡燈閃爍,網路運維可能會經常使用這個,因為機房網線錯綜複雜很難分清誰是誰的
$ sudo ethtool -p eth0

# 檢視網絡卡驅動
$ sudo ethtool -i eth0
# 檢視網絡卡支援的特性
$ sudo ethtool -k eth0
# 檢視與調整網絡卡佇列數Combined
$ sudo ethtool -l eth0
$ sudo ethtool -L eth0 combined 8

檢視其它硬體資訊

除了cpu、記憶體、磁碟、網絡卡外,機器上還有一些其它硬體,如匯流排、主機板、usb等,開發人員一般關注較少,這裡只簡單介紹一下,混個眼熟即可。

# 檢視usb裝置
$ lsusb

# 檢視pci裝置,一般外圍裝置都是通過pci匯流排連線進來的,所以這個命令一般可以看到很多裝置,包括磁碟與網絡卡等
# 輸出中Kernel driver in use表示裝置驅動,Kernel modules表示核心模組
$ lspci -v

# 通過這個命令,機器中所有的硬體資訊,都能檢視到
$ lshw

檢視系統資訊

做為後端開發,一般我們比較關注的系統資訊有核心版本、發行版、底層c庫版本等等,這些在Linux下也非常容易檢視,如下:

檢視核心版本

$ uname -r
5.4.0-74-generic

# 通過/proc/version也能看到核心版本
$ cat /proc/version
Linux version 5.4.0-74-generic (buildd@lgw01-amd64-038) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) 83-Ubuntu SMP Sat May 8 02:35:39 UTC 2021

可以看到,當前系統Linux核心版本是5.4.0-74-generic

另外,核心從原始碼編譯時可以配置一些選項,核心啟動時也可以配置一些選項,如要檢查這些選項,可如下檢視:

# /boot/config-*檔案儲存了核心的編譯配置
# 如下檢視核心編譯時是否開啟了KPROBES(核心追蹤)功能
$ cat /boot/config-`uname -r` | grep -i KPROBES
CONFIG_KPROBES=y

# 檢視核心啟動引數
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-5.4.0-74-generic root=UUID=fce5376b-dcc2-4550-a72a-e7cf0f5354a4 ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US text nomodeset vga=792

檢視發行版

Linux和Windows不一樣,Linux本身只是一個作業系統核心,它提供基礎的程序排程、記憶體管理等功能,而我們使用的Linux,如Ubuntu、Centos,這些是Linux發行版,它們將Linux下常用的軟體以及核心打包在一起,然後發行出來給大家使用,降低了Linux使用的難度。

如下,檢視當前系統是哪個發行版:

# /etc目錄下有各種*-release檔案,這些檔案裡面記錄著發行版的資訊
$ ls /etc/*-release
/etc/centos-release  /etc/os-release  /etc/redhat-release  /etc/system-release

# 一般通過/etc/os-release就可以了,如下顯示發行版是CentOS 7
$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"

檢視系統啟動時間

# 檢視系統啟動至今的秒數
$ cat /proc/uptime|cut -d. -f1
3810068

# 通過date命令轉化為啟動時間點,如下:
$ date -d "`cat /proc/uptime|cut -d. -f1` seconds ago" +'%F %T'
2021-11-04 12:51:50

檢視libc版本

像Linux上的glibc,Windows上的msvc,它們都是底層c庫,目前幾乎是所有應用層軟體的基石。

然而某些場景下,兩個不同版本的c庫,效能差別會非常大,因此常規性檢查一下它們的版本也是非常有必要的,如下:

# ldd可直接檢視glibc版本,如下顯示glibc版本是2.31
$ ldd --version
ldd (Ubuntu GLIBC 2.31-0ubuntu9) 2.31

# ldd可以檢視某個程式的所有動態連結庫
# 因此可以通過如下方法檢查java程式使用的各種底層庫版本
$ ldd `which java`
        linux-vdso.so.1 (0x00007ffeb11f1000)
        /usr/local/lib/libjemalloc.so (0x00007fdcdd8fe000)                           
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fdcdd8cb000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdcdd8a8000) # 執行緒庫
        libjli.so => /opt/jdk-11.0.12+7/bin/../lib/jli/libjli.so (0x00007fdcdd697000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fdcdd691000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdcdd49f000)            # 基礎c庫
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fdcdd2bb000)  # 基礎c++庫
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fdcdd2a0000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fdcdddc1000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fdcdd151000)
# c庫版本是2.31
$ ls -l /lib/x86_64-linux-gnu/libc.so.6
lrwxrwxrwx 1 root root 12 2020-04-15 03:26:04 /lib/x86_64-linux-gnu/libc.so.6 -> libc-2.31.so
# c++庫版本是6.0.28
$ ls -l /lib/x86_64-linux-gnu/libstdc++.so.6
lrwxrwxrwx 1 root root 19 2021-05-29 15:49:27 /lib/x86_64-linux-gnu/libstdc++.so.6 -> libstdc++.so.6.0.28
# pthread執行緒庫版本是2.31
$ ls -l /lib/x86_64-linux-gnu/libpthread.so.0
lrwxrwxrwx 1 root root 18 2020-04-15 03:26:04 /lib/x86_64-linux-gnu/libpthread.so.0 -> libpthread-2.31.so

neofetch

可以看到,上面那些命令檢視系統資訊還是比較零碎的,所以出現了一些命令,將上面的常見場景做了一些聚合,使得能快速直觀的看到系統的主要資訊,如neofetch命令:

$ neofetch

如上所示,neofetch會顯示發行版的一個炫酷圖示,上面那個像寫輪眼的圖示就是Ubuntu的logo。
然後會顯示一些系統關鍵資訊,如核心版本、啟動時間、Shell版本、CPU/GPU/Memory等。

本系列文章索引
Linux命令拾遺-入門篇
Linux命令拾遺-文字處理篇
Linux命令拾遺-軟體資源觀測
Linux命令拾遺-硬體資源觀測
Linux命令拾遺-剖析工具
Linux命令拾遺-動態追蹤工具
Linux命令拾遺-理解系統負載
Linux命令拾遺-top中的%nice是啥
Linux命令拾遺-網路抓包工具

往期內容

Linux命令拾遺-入門篇
原來awk真是神器啊
Linux文字命令技巧(上)
Linux文字命令技巧(下)
字元編碼解惑