目录

proc文件夹是干嘛用?

proc下都有什么系统信息?

/proc/bus

/proc/buddyinfo

/proc/cgroups

/proc/cmdline

/proc/consoles

/proc/cpuinfo

/proc/crypto

/proc/devices

/proc/diskstats

/proc/execdomains

/proc/fb

/proc/filesystems

/proc/fs

/proc/inerrupts

/proc/iomem

/proc/ioports

/proc/irq

/proc/kallsyms

/proc/keys

/proc/key-users

/proc/kmsg

/proc/kpagecgroup

/proc/kpagecount

/proc/kpageflags

/proc/loadavg

/proc/locks

/proc/mdstat

/proc/meminfo

/proc/misc

/proc/modules

/proc/mounts

/proc/net

/proc/pagetypeinfo

/proc/partitions

/proc/sched_debug

/proc/schedstat

/proc/scsi

/proc/slabinfo

/proc/softirqs

/proc/stat

/proc/swaps

/proc/sys

/proc/sysrq-trigger

/proc/sysvipc

/proc/timer_list

/proc/timer_stats

/proc/tty

/proc/uptime

/proc/version

/proc/vmallocinfo

/proc/vmstat

/proc/zoneinfo

最近由于定位问题,频繁查看一些proc的文件信息,所以索性就一文撸到底,把proc翻个底朝天吧。

proc文件夹是干嘛用?

在linux系统/proc目录中一些文件,记录一些系统运行时的信息,比如内存信息、网络信息、cpu信息等,但是要注意的是,这个目录下并不是保存真正的文件或者目录,只是一个伪文件系统。它只是保存在内存中,不是持久化的文件。可以理解为内核开放的一个集中查询系统信息的地方,方便查找使用,符合linux文件系统的习惯。

proc下都有什么系统信息?

/proc/bus

bus下有两个目录

input pci

Linux系统提供了 input 子系统,鼠标、键盘、触摸屏等设备都可以通过 input 接口函数来实现设备驱动

devices handlers

devices:注册的 input devices

handlers:注册的 input handlers

而 /proc/bus/input/devices 文件会记录已注册的 input 设备信息。可以使用 cat 命令直接查看该文件内容。其中devices里的信息如下:

I: Bus=0019 Vendor=0000 Product=0001 Version=0000

N: Name="Power Button"

P: Phys=PNP0C0C/button/input0

S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input0

U: Uniq=

H: Handlers=kbd event0

B: PROP=0

B: EV=3

B: KEY=10000000000000 0

从内容来看,每个设备信息的内容都有 I、N、P、S、U、H、B 几个字段

I :设备ID(struct input_id)

N:设备名称【Name】

P:系统层次结构中设备的物理路径【Physical path】

S:系统文件路径【Sysfs path】

U:设备的唯一识别码,可以为空【Unique identification code】

H:与设备关联的输入句柄列表【Handles】

B:位掩码,以十六进制表示【Bitmasks】

PROP:设备属性【Properties】

EV :设备支持的事件类型【Events】

KEY :设备拥有的键盘、按键

MSC :设备支持的杂项事件

LED :设备上的 LED

handlers的内容如下:

N: Number=0 Name=kbd

N: Number=1 Name=sysrq (filter)

N: Number=2 Name=mousedev Minor=32

N: Number=3 Name=evdev Minor=64

显示所有handlers的名称

pci中保存的为pci驱动相关信息, 由于系统下的文件较大, 不贴了,直接放字段解释:

每个PCI设备一行:

总共18个字段,每个字段之间是\t。

第一个字段是,总线设备功能,总线是前8位,后8位是设备(前5位)和功能(后3位)。

第二个字段是,vendor(前16位)和device(后16位)。

第三个字段是,中断号

第4-10个字段是bar0-bar6以及flag信息。

第11-17个字段是bar0-bar6的长度。

第18个字段是设备名称,optional

/proc/buddyinfo

buddyinfo用于记录系统的内存资源。linux的内存系统使用buddy算法来管理内存以减少内存碎片的产生。buddy算法管理最小的单一为PAGE_SIZE,一般情况下大小为4K。以2的N次幂一次增加。

Node 0, zone DMA32 635 549 425 251 124 66 23 2 4 0 0 0 0 0

Node 0, zone Normal 2947 1489 456 145 347 146 49 24 16 5 2 0 0 0

/proc/cgroups

controller group,用来限制、记录、隔离进程组的物理资源,将任意进程进行分组化管理的Linux内核功能。cgroup本身提供将进程进行分组化管理的功能和接口的基础结构。实现 cgroups 的主要目的是为不同用户层面的资源管理提供一个统一化的接口。从单个任务的资源控制到操作系统层面的虚拟化,cgroups 提供了五大功能:

资源限制(Resource limiting ):比如memory子系统可以为进程组设定一个memory使用上限,进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)
优先级控制(Prioritization):比如可以使用cpu子系统为某个进程组分配cpu share
资源统计(Accounting ):比如使用cpuacct子系统记录某个进程组使用的cpu时间
进程组隔离(Isolation):比如使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间
进程组控制(Control):比如使用freezer子系统可以将进程组挂起和恢复

#subsys_name    hierarchy       num_cgroups     enabled
cpuset  6       1       1
cpu     7       1       1
cpuacct 7       1       1
blkio   10      1       1
memory  9       175     1
devices 3       110     1
freezer 4       1       1
net_cls 2       1       1
perf_event      11      1       1
net_prio        2       1       1
hugetlb 12      1       1
pids    8       167     1
rdma    5       1       1
 cpu 限制 CPU 时间片的分配,与 cpuacct 挂载在同一目录
cpuacct 生成 cgroup 中的任务占用 CPU 资源的报告,与 cpu 挂载在同一目录
cpuset 给 cgroup 中的任务分配独立的 CPU(多处理器系统) 和内存节点
 devices 允许或禁止 cgroup 中的任务访问设备
 freezer 暂停/恢复 cgroup 中的任务
 hugetlb 限制使用的内存页数量
memory 对 cgroup 中的任务的可用内存进行限制,并自动生成资源占用报告
net_cls 使用等级识别符(classid)标记网络数据包,这让 Linux 流量控制器(tc 指令)可以识别来自特定 cgroup 任务的数据包,并进行网络限制
net_prio 允许基于 cgroup 设置网络流量(netowork traffic)的优先级
 perf_event 允许使用 perf 工具来监控 cgroup
 pids 限制任务的数量
rdma 限制进程对rdma和ib资源的使用。rdma作为host-offload、host-bypass技术,使低延迟、高带宽的直接内存到内存的数据通信成为可能。ib为新一代网络协议
 systemd systemd 提供了 cgroups 的使用和管理接口,在系统的开机阶段,systemd 会把支持的 controllers (subsystem 子系统)挂载到默认的 /sys/fs/cgroup/ 目录下面

/proc/cmdline

在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递

test@LAPTOP-D98HS8JP:/proc$ cat cmdline
BOOT_IMAGE=/kernel init=/init

/proc/consoles

使用的控制台

ttyAMA0              -W- (EC p a)  114:64

/proc/cpuinfo

记录设备的CPU信息

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 141
model name      : 11th Gen Intel(R) Core(TM) i5-11400H @ 2.70GHz
stepping        : 1
microcode       : 0xffffffff
cpu MHz         : 2688.000
cache size      : 1280 KB
physical id     : 0
siblings        : 12
core id         : 0
cpu cores       : 6
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 6
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave osxsave avx f16c rdrand lahf_lm abm 3dnowprefetch fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl avx512vbmi umip pku avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid ibrs ibpb stibp ssbd
bogomips        : 5376.00
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

对此款芯片的简单总结:芯片型号是"Hygon C86 3135",拥有4个物理处理核,8个逻辑处理核(使用超线程技术),CPU主频是3499.941MHZ,二级缓存大小是512KB。
(1)processor :系统中逻辑处理核的编号。对于单核处理器,则课认为是其CPU编号,对于多核处理器则可以是物理核、或者使用超线程技术虚拟的逻辑核
(2)vendor_id :CPU制造商
(3)cpu family :CPU产品系列代号
(4)model   :CPU属于其系列中的哪一代的代号
(5)model name:CPU属于的名字及其编号、标称主频
(6)stepping  :CPU属于制作更新版本
(7)cpu MHz  :CPU的实际使用主频
(8)cache size :CPU二级缓存大小
(9)physical id :单个CPU的标号
(10)siblings :单个CPU逻辑物理核数
(11)core id :当前物理核在其所处CPU中的编号,这个编号不一定连续
(12)cpu cores :该逻辑核所处CPU的物理核数
(13)apicid :用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续
(14)fpu :是否具有浮点运算单元(Floating Point Unit)
(15)fpu_exception :是否支持浮点计算异常
(16)cpuid level :执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容
(17)wp :表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection)
(18)flags :当前CPU支持的功能
(19)bogomips :在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second)
(20)clflush size :每次刷新缓存的大小单位
(21)cache_alignment :缓存地址对齐单位
(22)address sizes :可访问地址空间位数
(23)power management :对能源管理的支持,有以下几个可选支持功能:

/proc/crypto

系统上已安装的内核使用的密码算法及每个算法的详细信息列表

name : crc32

driver : crc32-pclmul

module : crc32-pclmul

priority : 250

refcnt : 1

selftest : passed

internal : yes

type : skcipher

blocksize : 16

digestsize: 4

/proc/devices

字符装置(Character Device)和块装置(Block Device)的major number和名字。比如你知道一个device的major number和minor number,你就可以通过改device的major number在这个文件里面查到device的具体类型。

Character devices:

1 mem

4 /dev/vc/0

4 tty

4 ttyS

5 /dev/tty

5 /dev/console

5 /dev/ptmx

7 vcs

10 misc

13 input

Block devices:

8 sd

9 md

11 sr

65 sd

66 sd

67 sd

/proc/diskstats

内核通过diskstats文件,将通用块设备层的一些重要指标以文件的形式呈现给用户,/proc/diskstats 文件中,包含了设备相关的信息,即磁盘相关的信息,以文件形式保存。

253 0 vda 1746168 36417 1176610770 181628087 21568405 976149 1056163141 327225581 0 108763630 475299800 0 0 0 0253 1 vda1 115 226 14601 318 1 0 1 0 0 340 190 0 0 0 0253 2 vda2 524 0 126308 3107 20 2 4452 166 0 1560 2500 0 0 0 0253 3 vda3 1745491 36191 1176463845 181624445 14007587 976147 1056158688 324926062 1 91126960 473918270 0 0 0 0253 16 vdb 10202124 4961 4884985263 375955447 23440092 766118 4433247734 605919961 0 111733750 909536000 0 0 0 0253 17 vdb1 10202103 4961 4884981423 375955398 15879335 766118 4433247734 600854086 1 73556740 905749350 0 0 0 011 0 sr0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0252 0 dm-0 11923311 0 6052040092 559235180 38612989 0 5445892975 999320890 2 139854130 1558556070 0 0 0 0252 1 dm-1 73372 0 9395456 1487730 607717 0 77787776 200728120 0 599140 202215850 0 0 0 0

vda:设备名。一般ide接口的以hd[a-d]口命名,scsi和sata接口的以sd[a-z]命名。

/proc/execdomains

内核当前支持的执行域(每种操作系统独特“个性”)信息列表

0-0 Linux [kernel]

/proc/fb

可用的帧缓冲列表,包含帧缓冲设备的设备号和相关驱动信息

/proc/filesystems

当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型。

nodev sysfs

nodev rootfs

nodev ramfs

nodev bdev

nodev proc

nodev cpuset

/proc/fs

包含了一些文件系统信息。比较有用的有/proc/fs/ext4目录,该目录下的每个subdirectory表示一个被挂载的device名字,device名字目录下还有mb_groupsoptions文件。

[test@myLinux fs]$ ls

aufs ext4 fscache jbd2 lockd nfs nfsd nfsfs xfs

/proc/inerrupts

        系统中断使用信息,X86或X86_64体系架构系统上每个IRQ相关的中断号列表;多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号。

CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       CPU8       CPU9       CPU10      CPU11      CPU12      CPU13      CPU14      CPU152: 1017998324 3523442607 4209774678  111105660 3994378972 3926886470 3959970091 3993317757 4067035816 3806411631 4067614717 4021606034 4099769443 4048179032  103373262 4167652047     GICv3  27 Level

/proc/iomem

每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息,在 kernel/resource.c 中创建。

[test@myLinux proc]$ cat iomem
00000000-00000000 : LNRO0015:00
00000000-00000000 : LNRO0015:01
00000000-00000000 : ARMH0011:0000000000-00000000 : ARMH0011:00
00000000-00000000 : QEMU0002:0000000000-00000000 : fw_cfg_mem
00000000-00000000 : LNRO0005:00

/proc/ioports

提供了当前注册的端口区域列表,用于与设备进行输入或输出通信,包含了kernel driver用request_region划定的IO ports 范围的列表。第一列是IO ports的范围,第二列是调用request_region的kernel driver名字。

[test@myLinux proc]$ cat ioports
00000000-00000000 : PCI Bus 0000:0000000000-00000000 : PCI Bus 0000:0100000000-00000000 : PCI Bus 0000:0200000000-00000000 : 0000:02:03.000000000-00000000 : 0000:02:01.000000000-00000000 : ahci00000000-00000000 : 0000:02:04.000000000-00000000 : uhci_hcd00000000-00000000 : 0000:02:06.000000000-00000000 : PCI Bus 0000:3f

第一列给出了为第二列中列出的设备保留的 I/O 端口地址范围,I/O端口地址空间通常都比较小。CPU通过设立专门的IN和OUT指令来访问这一空间中的地址单元(即I/O端口)

/proc/irq

        中断系统子目录。每个注册的irq创建一个以irq编号为名字的子目录,每个子目录下分别有以下条目:

affinity_hint :只读条目,用于用户空间做irq平衡;

node :不明,参考kernel doc

smp_affinity :是一个bitmask用来设置CPU affinity,用来表示那些CPU可以handler这个IRQ,比如,echo 5 > /proc/irq/10/smp_affinity 表示1,2,3号CPU可以处理10号IRQ。当有多个CPU可以执行该IRQ时,kernel会采用Round Robin的方式去分配

spurious:可以获得该irq被处理和未被处理的次数的统计信息。

/proc/irq/default_smp_affinity 里面记录了对于未激活(non-allocated/activated) 的IRQ的CPU affinity bitmask。因为这些未激活的IRQ没有自己的subdirectory。

[test@myLinux proc]$ cd irq
[test@myLinux irq]$ ls
1    104  109  114  119  124  129  134  4   44  49  54  59  64  69  74  79  84  89  94  99
100  105  110  115  120  125  130  2    40  45  50  55  60  65  70  75  80  85  90  95  default_smp_affinity
101  106  111  116  121  126  131  3    41  46  51  56  61  66  71  76  81  86  91  96
102  107  112  117  122  127  132  37   42  47  52  57  62  67  72  77  82  87  92  97
103  108  113  118  123  128  133  39   43  48  53  58  63  68  73  78  83  88  93  98
[test@myLinux irq]$ cat default_smp_affinity
ffff

/proc/kallsyms

在内核中通过/proc/kallsyms获得符号的地址。

生成过程:

./scripts/kallsyms.c负责生成System.map

./kernel/kallsyms.c负责生成/proc/kallsyms

./scripts/kallsyms.c解析vmlinux(.tmp_vmlinux)生成kallsyms.S(.tmp_kallsyms.S),然后内核编译过程中将kallsyms.S(内核符号表)编入内核镜像uImage

内核启动后./kernel/kallsyms.c解析uImage形成/proc/kallsyms

/proc/kallsyms包含了内核中的函数符号(包括没有EXPORT_SYMBOL)、全局变量(用EXPORT_SYMBOL导出的全局变量)

/proc/keys

系统授权密钥环记录,包含了暴露给reading thread的key的列表

[test@myLinux proc]$ cat keys
0256e6a6 I--Q---  194 perm 3f030000  1000  1000 keyring  _ses: 3
20d035bf I--Q---    1 perm 3f010000  1000  1000 user     mykey: 16

/proc/key-users

此文件列出了每个用户ID的各种信息在系统上至少有一个密钥。

[test@myLinux proc]$ cat key-users0:    86 85/85 79/1000000 1488/25000000192:     1 1/1 1/200 9/20000

/proc/kmsg

内核日志,通过dmesg或者klogd查看。

/proc/kpagecgroup

这个文件包含一个64位的内存索引节点号cgroup每页收费,按页面框架编制索引数字。

/proc/kpagecount

此文件包含64位的次数计数每个物理页面帧都被映射,并按页面帧进行索引数字。

/proc/kpageflags

此文件包含64位掩码,每个掩码对应物理页面框架;它是按页码索引的。

/proc/loadavg     

用来表示CPU和IO的负载。从左到右分别是1分钟,5分钟,15分钟的平均CPU和IO负载值,running的进程数/总进程数,最后使用的进程ID。这是一个很重要的一个系统负载指标,可以使用top,w,uptime,vmstat等命令查看。

[test@myLinux proc]$ cat loadavg
2.89 3.26 3.34 5/2916 3945357

/proc/locks

        记录当前被kernel锁住的文件。

[test@myLinux proc]$ cat locks
1: FLOCK  ADVISORY  WRITE 2814436 fc:00:872727024 0 EOF
2: FLOCK  ADVISORY  WRITE 984 00:17:16298 0 EOF
3: FLOCK  ADVISORY  WRITE 1417 00:17:16853 0 EOF

从左到右分别表示:

  • unique ID
  • 锁种类:FLOCK为老式UNIX锁,POSIX为新式POSIX锁(使用lockf系统调用)
  • 锁形式:ADVISORY表示不会阻止其他进程访问数据,当时会阻止获取锁。MANDATORY表示禁止任何访问
  • 锁权限:READ或者WRITE
  • 进程ID
  • 文件ID:格式为,MAJOR:MINOR:INODE-NUMBER
  • 文件开始位置
  • 文件结束位置

/proc/mdstat

显式磁盘的信息,包含正在使用RAIDS、创建分区情况等。

/proc/meminfo

linux系统内存使用状况,是也一个较常使用的信息,常用的free、vmstat都是获取这里的信息。

[test@myLinux proc]$ cat meminfo
MemTotal:       32103296 kB
MemFree:         3933504 kB
MemAvailable:   10393024 kB
Buffers:            1344 kB
Cached:         11626304 kB
SwapCached:        70208 kB
Active:         13616512 kB
Inactive:       13533184 kB
Active(anon):   13305984 kB
Inactive(anon):  2925312 kB
Active(file):     310528 kB
Inactive(file): 10607872 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       4222912 kB
SwapFree:        1743872 kB
Dirty:               640 kB
Writeback:             0 kB
AnonPages:      15454400 kB
Mapped:           372672 kB
Shmem:            709440 kB
Slab:             616640 kB
SReclaimable:     100288 kB
SUnreclaim:       516352 kB
KernelStack:       46864 kB
PageTables:        67776 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    20274560 kB
Committed_AS:   45796736 kB
VmallocTotal:   133009637312 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:            49152 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
CmaTotal:         524288 kB
CmaFree:          486336 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:     524288 kB
Hugetlb:               0 kB

MemTotal系统从加电开始到引导完成,firmware/BIOS要保留一些内存,kernel本身要占用一些内存,最后剩下可供kernel支配的内存就是MemTotal。这个值在系统运行期间一般是固定不变的。可参阅解读DMESG中的内存初始化信息。

MemFree表示系统尚未使用的内存。[MemTotal-MemFree]就是已被用掉的内存。

MemAvailable有些应用程序会根据系统的可用内存大小自动调整内存申请的多少,所以需要一个记录当前可用内存数量的统计值,MemFree并不适用,因为MemFree不能代表全部可用的内存,系统中有些内存虽然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以这部分可回收的内存加上MemFree才是系统可用的内存,即MemAvailable。/proc/meminfo中的MemAvailable是内核使用特定的算法估算出来的,要注意这是一个估计值,并不精确。

MemTotal:可用物理内存大小,是实际的物理内存条的总大小减去fireware和kernel本身占用的内存,即能够被kernel使用的内存总大小

MemFree:空闲内存大小,即free中的free大小

MemAvailable:可用内存大小,MemFree表示的是当前空闲的内存,但是在系统中还有一些内存虽然已经被使用但是可以被释放掉,如cache、buffer、slab中的部分,这些可回收的内存大小加上MemFree的大小才是系统的可用内存大小,即MemAvailable,MemAvailable·是一个估计值,因为一部分内存还没有被回收,这只是根据内核算法估算出来的结果,所以并不精确。

Buffers:块设备使用的缓存,包括直接读写块设备、以及文件系统的的元数据所使用的缓存,

直接对块设备进行读写操作使用的缓存。主要包括:直接读写块设备,文件系统元数据(比如superblock,不包括文件系统中文件的元数据)。它与Cached的区别在于,Cached表示的普通文件的缓存。

Cached:文件缓存

Buffers+Cached = Active(file)+Inactive(file)+Shmem

SwapCached:交换分区上占用的空间

Active:Active(anon) + Active(file),活跃的缓存大小

Inactive:Inactive(anon) +Inactive(file) 不活跃的缓存大小

Active(anon)/Inactive(anon)/Active(file)/Inactive(file):anon表示匿名内存,file表示文件内存,active表示最近使用过的内存,inactive表示最近没有使用的内存。当内存释放的时候,会优先释放inactive的内存空间。

Unevictable:不能够被释放的内存

Mlocked:被mlock()系统调用锁定的内存大小

SwapTotal:swap分区的大小

SwapFree:swap分区未使用的大小

Dirty:脏数据,尚未写入到磁盘中的数据大小

Writeback:正在写入的脏数据大小

AnonPages:匿名页的大小

Mapped:正在被进程关联的文件缓存大小

Shmem:tmpfs文件系统使用的内存和共享缓存大小

Slab:slab分配器使用的内存大小,等于SReclaimable+Sunreclaim

SReclaimable:Slab中不活跃的对象,可以被回收的容量

Sunreclaim:Slab中活跃的对象,不能被回收的容量

KernelStack:内核使用的堆栈大小,当前系统进程越多,kernelstack的值就越大

PageTables:页表使用的内存空间大小

NFS_Unstable:发送给NFS server但是还没有写入硬盘的缓存

Bounce:跳转buffer

CommitLimit:允许超过的虚拟内存大小

VmallocTotal:理论上虚拟内存空间的总大小

VmallocUsed:固定为0

VmallocChunk:固定为0

HardwareCorrupted:系统检测到内存上存在的硬件故障,会把有故障的页删除掉不再使用,HardwareCorrupted上就记录了删除掉的内存页大小

AnonHugePages:透明大页使用量

HugePage_Total:分配的大页内存大小

HugePage_Free:空闲的大页内存大小

Hugepagesize:大页大小

/proc/misc

提供了那些没有被ASSIGN给其它/proc文件的数据信息,获取内核或硬件设备的某些信息。这些信息通常是原始数据的形式,需要一定的解释和分析后才能真正理解。

/proc/modules

显示所有被加载到kernel的模块。使用lsmod命令查看更加工整。

[test@myLinux proc]$ cat modules
nfsv3 262144 0 - Live 0x0000000000000000
rpcsec_gss_krb5 262144 0 - Live 0x0000000000000000
nfsv4 786432 2 - Live 0x0000000000000000
dns_resolver 262144 1 nfsv4, Live 0x0000000000000000
nfs 458752 3 nfsv3,nfsv4, Live 0x0000000000000000
fscache 524288 2 nfsv4,nfs, Live 0x0000000000000000

从左到右分别是:

  • 模块名字
  • 模块所占内存大小
  • 有多少实例被加载
  • 所依赖的模块列表
  • 模块状态,Live,Loading,Unloading
  • 模块所在kernel内存的offset,用来做debug分析用,比如oprofile工具

/proc/mounts

        当前系统的文件系统mount列表。

[test@myLinux proc]$ cat mounts
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0

从左到右依次是:

  • 文件系统名字
  • 文件mount点
  • 文件系统类型
  • 权限
  • dump
  • fsck

/proc/net

也是一个很重要的文件记录,记录了系统的网络情况和网络配置信息。

[test@myLinux net]$ ls
anycast6   fib_trie      igmp6          ip_tables_matches  netfilter  psched  rt6_stats  sockstat6     udp6
arp        fib_triestat  ip6_flowlabel  ip_tables_names    netlink    ptype   rt_acct    softnet_stat  udplite
connector  icmp          ip6_mr_cache   ip_tables_targets  netstat    raw     rt_cache   stat          udplite6
dev        icmp6         ip6_mr_vif     ipv6_route         nfsfs      raw6    snmp       tcp           unix
dev_mcast  if_inet6      ip_mr_cache    mcfilter           packet     route   snmp6      tcp6          wireless
dev_snmp6  igmp          ip_mr_vif      mcfilter6          protocols  rpc     sockstat   udp           xfrm_stat

/proc/net/tcp 显示tcp4网络信息   /proc/net/tcp6 显示tcp6网络信息

/proc/pagetypeinfo

相较于/proc/buddyinfo,该文件包含了更细节的空闲page的统计。用以分析内存分配bug。内核中通过对不同页面进行分组来避免碎片化将类型迁移到称为页块的相同连续内存区域中。

Page block order: 9
Pages per block:  512Free pages count per migrate type at order       0      1      2      3      4      5      6      7      8      9     10
Node    0, zone      DMA, type    Unmovable      0      1      0      1      1      1      1      0      1      0      0
Node    0, zone      DMA, type      Movable      0      0      0      0      0      0      0      0      0      1      3
Node    0, zone      DMA, type  Reclaimable      0      0      0      0      0      0      0      0      0      0      0
Node    0, zone      DMA, type   HighAtomic      0      0      0      0      0      0      0      0      0      0      0
Node    0, zone      DMA, type      Isolate      0      0      0      0      0      0      0      0      0      0      0
Node    0, zone    DMA32, type    Unmovable     40     22      4     15      7      2      0      0      1      1      1
Node    0, zone    DMA32, type      Movable   2674   2438   1697   1214    594    143     27      4      4      1    476
Node    0, zone    DMA32, type  Reclaimable     30     36     18      9     11      9     17     13      5      3      4
Node    0, zone    DMA32, type   HighAtomic      0      0      0      0      0      0      0      0      0      0      0
Node    0, zone    DMA32, type      Isolate      0      0      0      0      0      0      0      0      0      0      0
Node    0, zone   Normal, type    Unmovable    126     32     17      5      7      0      0      0      0      0      0
Node    0, zone   Normal, type      Movable     49  11390   4915    618    279      4      0      0      0      0      0
Node    0, zone   Normal, type  Reclaimable    127     78    253     99     75      9      1      0      0      0      0
Node    0, zone   Normal, type   HighAtomic      0      0      0      0      0      0      0      0      0      0      0
Node    0, zone   Normal, type      Isolate      0      0      0      0      0      0      0      0      0      0      0 Number of blocks type     Unmovable      Movable  Reclaimable   HighAtomic      Isolate
Node 0, zone      DMA            1            7            0            0            0
Node 0, zone    DMA32            6         1754           24            0            0
Node 0, zone   Normal          221         1724          343            0            0

/proc/partitions

包含了系统分区的信息。从左到右依次是:major number,minor number,block数量,分区名称。

major minor  #blocks  name253        0   52428800 vda253        1     204800 vda1253        2    1048576 vda2253        3   51173376 vda3253       16  262144000 vdb253       17  262142976 vdb111        0    1048575 sr0252        0  309088256 dm-0252        1    4222976 dm-1

/proc/sched_debug

kernel调度器的debug信息。

/proc/schedstat

        调度器状态数据

version 15
timestamp 5584247103
cpu0 0 0 0 0 0 0 424405389779060 96615823560430 22857723126
domain0 ffff 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

/proc/scsi

以驱动程序命名的目录中的每个适配器都有一个文件系统。这些文件包含有关控制器的信息,包括所使用的IRQ和IO地址范围。显示的信息量为取决于使用的适配器。

[test@myLinux proc]$ cd scsi
[test@myLinux scsi]$ ls
device_info  scsi  sg
/proc/scsi/scsi文件中包含了被识别的scsi装置的列表。

/proc/slabinfo

包含slab内存分配情况。Linux kernel会使用slab分配器进行低于一个內存页的内存分配。

/proc/softirqs

为每个cpu提供自引导时间以来服务的softirq处理程序的计数。不同CPU上的软中断(soft interrupt)的数量统计。其中第一列里,TIMER为定时中断、NET_RX为网络接收、NET_TX为网络发送,SCHED内核调度、RCU(RCU 锁)。可以使用mpstate命令查看。当top发现CPU的si使用率很高时可以通过该文件查看那一类中断比较多,从而定位性能瓶颈。

> cat /proc/softirqsCPU0       CPU1       CPU2       CPU3HI:          0          0          0          0TIMER:      27166      27120      27097      27034NET_TX:          0          0          0         17NET_RX:         42          0          0         39BLOCK:          0          0        107       1121TASKLET:          0          0          0        290SCHED:      27035      26983      26971      26746HRTIMER:          0          0          0          0RCU:       1678       1769       2178       2250

/proc/stat

记录了系统自上一次启动以来的一些运行数据,比如CPU在不同情况下的使用时间,中断数统计,上下文切换统计等等。此文件中报告的所有数字都是聚合数自系统首次启动以来。为了快速查看,只需将文件放入cat即可。

pu  244939043 160629 336654028 19810440829 26785008 71364376 44858107 0 0 0
cpu0 15394097 6838 21312646 1237930729 1819759 4460072 785206 0 0 0
cpu1 15903537 9583 21189406 1238963231 1755757 4487373 964874 0 0 0
cpu2 15625317 10440 21035396 1240356984 1619028 4344654 681100 0 0 0
cpu3 15389994 11336 20958128 1240475628 1694415 4374730 671430 0 0 0
cpu4 14765742 9987 21217351 1236138615 1660872 4556678 5244293 0 0 0
cpu5 15367563 10250 21036247 1236288558 1685287 4539681 4699207 0 0 0
cpu6 15621070 10316 20939876 1240437285 1657916 4323438 666094 0 0 0
cpu7 15042360 9733 20872200 1235218742 1521256 4600572 6344072 0 0 0
cpu8 15442128 9082 21049992 1240477633 1648660 4340707 668411 0 0 0
cpu9 15087681 9847 21031726 1235895283 1729551 4545753 5288452 0 0 0
cpu10 15296187 8765 21014969 1240382292 1716971 4370892 686983 0 0 0
cpu11 14502440 10752 20718650 1231199081 1594800 4768636 10780291 0 0 0
cpu12 15418422 11130 21081642 1240490524 1607996 4344265 668224 0 0 0
cpu13 15459410 8682 21040178 1240389689 1712380 4341569 668204 0 0 0
cpu14 15467422 10470 21137205 1239895477 1716727 4426684 671508 0 0 0
cpu15 15155665 13409 21018407 1235901069 1643625 4538663 5369752 0 0 0
intr 79132619396 0 0 1612993883 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65 0 0 0 0 0 1 1 1 1 1 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 0 0 28130950 0 30553058 11094934 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 0 26097831 3 0 990261890 496529
ctxt 727964631919
btime 1670469897
processes 326788297
procs_running 3
procs_blocked 0
softirq 27907662096 3 2592561657 34065392 1442525309 63561764 0 2383454 3477120843 3772741 3111801749

/proc/swaps

记录系统的swap空间以及使用数据。其中有多个swap空间是,Priority的值越低越会被使用。

Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       4222912 2479040 -2

/proc/sys

提供kernel runtime配置接口。可以通过sysctl命令操作。

[test@myLinux proc]$ cd sys
[test@myLinux sys]$ ls
crypto  debug  dev  fs  fscache  kernel  net  user  vm

/proc/sysrq-trigger

通过echo特定的指令到该文件中可以触发一些效果。需要使用root用户触发。也可以使用组合键Alt + SysRq + [command]的方式触发 。通过/proc/sys/kernel/sysrq可以显示哪些命令可以生效。

立即重新启动计算机
echo "b" > /proc/sysrq-trigger# 立即关闭计算机
echo "o" > /proc/sysrq-trigger# 导出内存分配的信息 (可以用/var/log/message 查看)
echo "m" > /proc/sysrq-trigger# 导出当前CPU寄存器信息和标志位的信息
echo "p" > /proc/sysrq-trigger# 导出线程状态信息
echo "t" > /proc/sysrq-trigger# 故意让系统崩溃
echo "c" > /proc/sysrq-trigger
# 立即重新挂载所有的文件系统
echo "s" > /proc/sysrq-trigger
# 立即重新挂载所有的文件系统为只读
echo "u" > /proc/sysrq-trigger
# r、e、i、s、u、b的顺序触发,让系统安全重启

/proc/sysvipc

记录System V IPC相关的信息,

[test@myLinux sysvipc]$ ls
msg  sem  shm
[test@myLinux sysvipc]$
[test@myLinux sysvipc]$ cat msgkey      msqid perms      cbytes       qnum lspid lrpid   uid   gid  cuid  cgid      stime      rtime      ctime[test@myLinux sysvipc]$ cat semkey      semid perms      nsems   uid   gid  cuid  cgid      otime      ctime808241953      65536   777          1  1001  1001  1001  1001 1670570581 1670491425808241955      98305   777          1  1001  1001  1001  1001 1670570581 1670491425808240416     131074   777          1  1001  1001  1001  1001 1673333559 1673333518808240417     163843   777          1  1001  1001  1001  1001 1673333559 1673333518808218727     196612   777          1  1021  1021  1021  1021 1677238188 1677565727808218728     229381   777          1  1021  1021  1021  1021 1677238188 1677565727808232700     262150   777          1  1021  1021  1021  1021 1678691867 1678672746808232703     294919   777          1  1021  1021  1021  1021 1678691867 1678672747808215986     327688   777          1  1021  1021  1021  1021 1679557274 1679557251808215989     360457   777          1  1021  1021  1021  1021 1679557274 1679557251808253583     393226   777          1  1023  1023  1023  1023 1680496661 1680496653808253586     425995   777          1  1023  1023  1023  1023 1680496661 1680496653808190784     458764   777          1  1021  1021  1021  1021 1682072583 1681917600808190785     491533   777          1  1021  1021  1021  1021 1682072583 1681917600808233564     524302   777          1  1023  1023  1023  1023 1683337566 1683334662808233567     557071   777          1  1023  1023  1023  1023 1683337566 1683334662
[test@myLinux sysvipc]$ cat shmkey      shmid perms                  size  cpid  lpid nattch   uid   gid  cuid  cgid      atime      dtime      ctime                   rss                  swap
  • msg:表示消息
  • sem:表示信号量(semaphore)
  • shm:共享内存

/proc/timer_list

内核提供了方便查看当前系统TickDevice、活动的Timer列表以及Timer使用的统计信息。内核分别用两个节点来表示TimerList和Timer统计信息。

一个是/proc/timer_list,打印per_cpu的hrtimer_bases信息以及基于此的timer列表,包括三种时MONOTONIC/REALTIME/BOOTTIME;以及Broadcast Tick Device和Per CPU Tick Device信息。

另一个是/proc/timer_stats,需要echo 1 > /proc/timer_stats打开,echo 0 /proc/timer_stats关闭。cat /proc/timer_stats可以获取统计信息。

/proc/timer_stats

需要echo 1 > /proc/timer_stats打开,echo 0 /proc/timer_stats关闭。cat /proc/timer_stats可以获取统计信息。

统计结束后:从左到右依次是,timer count、进程号、进程名称、超时函数、启动timer函数。通过timer_stats可以知道系统的timer使用程度,一定程度上反映了进程的活跃状态

/proc/tty

存储着可以使用以及正在使用的tty装置的信息。Linux上有3种tty装置,serial tty,pesudo tty,以及virtual tty。使用中的tty装置记录在 /proc/tty/drives文件中。/proc/tty/driver/serial中记录了每个serial tty的使用情况 。

[test@myLinux proc]$ cd tty
[test@myLinux tty]$ ls
driver  drivers  ldisc  ldiscs

/proc/uptime

系统uptime时间,uptime命令查看的就是当前的记录

12893374.32 199328575.48

第一个参数代表从系统启动到现在的时间(以秒为单位)

第二个参数代表系统空闲的时间(以秒为单位

在SMP系统里,系统空闲的时间有时会是系统运行时间的几倍,因为系统空闲时间的计算,是把SMP算进去的,就是所你有几个逻辑的CPU(包括超线程)。

系统的空闲率(%) = num2/(num1*N) 其中N是SMP系统中的CPU个数。
计算一下空闲率:
3310821.00 / 3387048.81 = 0.9774943278718207
也就是说:它的空闲率是97%

说明:
(1)空闲率高低并不单意味着,它做的工作多少,还有跟服务器的配置和性能有很大的关系。
(2)空闲率跟服务器的配置有很大的关系,服务器的性能越好,配置越高,它处理的速度越快,配置高的服务器处理的时间要小于配置低的服务器。
(3)从空闲时间,你就可以判断你的服务器负载是否过大,看一下是不是有异常情况发生,如果空闲时间很小,说明你的服务器已经在满负荷运行,然后决定是不是需要升级你的服务器。
(4)系统空闲率越大,说明系统比较闲,可以加重一些负载;而系统空闲率很小,则可能考虑升级本机器硬件或者迁移部分负载到其他机器上。

/proc/version

系统kernel版本信息

Linux version 4.4.0-19041-Microsoft (Microsoft@Microsoft.com) (gcc version 5.4.0 (GCC) ) #2311-Microsoft Tue Nov 08 17:09:00 PST 2022

/proc/vmallocinfo

vmalloc分配信息,Vmalloc用来将不连续的物理地址分配给连续的虚拟地址。

> cat /proc/vmallocinfo
0xffffc20000000000-0xffffc20000201000 2101248 alloc_large_system_hash+0x204 .../0x2c0 pages=512 vmalloc N0=128 N1=128 N2=128 N3=128
0xffffc20000201000-0xffffc20000302000 1052672 alloc_large_system_hash+0x204 .../0x2c0 pages=256 vmalloc N0=64 N1=64 N2=64 N3=64
0xffffc20000302000-0xffffc20000304000    8192 acpi_tb_verify_table+0x21/0x4f...phys=7fee8000 ioremap
0xffffc20000304000-0xffffc20000307000   12288 acpi_tb_verify_table+0x21/0x4f...phys=7fee7000 ioremap
0xffffc2000031d000-0xffffc2000031f000    8192 init_vdso_vars+0x112/0x210

从左到右依次是:虚拟地址,分配大小,哪个函数分配的,物理地址,分配类型

/proc/vmstat

显示从内核导出的虚拟内存的统计信息

nr_free_pages 61121 //空闲页数量
nr_zone_inactive_anon 45836 //所有zone统计的非活跃的匿名页数之和
nr_zone_active_anon 208114 //所有zone统计的活跃的匿名页数之和
nr_zone_inactive_file 165808 //所有zone统计的非活跃的文件页数之和
nr_zone_active_file 4853 //所有zone统计的活跃的文件页数之和
nr_zone_unevictable 0 //所有zone统计的不可释放的页数之和
nr_zone_write_pending 9 //脏页、写回页和不稳定页的计数
nr_mlock 0 //mlock的页数
nr_page_table_pages 1059 //分配到页表的页数
nr_kernel_stack 46880 //分配给内核堆栈的内存量
nr_bounce 0 //缓冲取页数量
nr_zspages 0 //Zsmalloc分配器分配的页数量
nr_free_cma 7599 //可用的CMA(连续内存分配器)页面数
numa_hit 41950664048 //进程从此节点成功分配成功的内存
numa_miss 0 //在非预期节点中分配
numa_foreign 0 //进程想在这个节点上分配,但最终却从另一个节点获得了内存
numa_interleave 4624 //交织分配的页
numa_local 41950664048 //从本地节点分配的内存
numa_other 0 //从其他节点分配的内存
nr_inactive_anon 45836 //所有node统计的非活跃的匿名页数之和
nr_active_anon 208114 //所有node统计的活跃的匿名页数之和
nr_inactive_file 165808 //所有node统计的非活跃的文件页数之和
nr_active_file 4853 //所有node统计的活跃的文件页数之和
nr_unevictable 0 // 所有node统计的不可释放的页数之和
nr_slab_reclaimable 1567 //已经分配出去的reclaimable slab object的内存大小
nr_slab_unreclaimable 8062 // 已经分配出去的unreclaimable slab object的内存大小
nr_isolated_anon 0 //anon lru的临时隔离页
nr_isolated_file 0 //文件lru临时隔离页
workingset_refault 14562813 //TODO

/proc/zoneinfo

DMA,Normal, Highmem区域的详细内存使用情况

Node 0, zone    DMAper-node statsnr_inactive_anon 45836nr_active_anon 208140nr_inactive_file 166920nr_active_file 5141nr_unevictable 0nr_slab_reclaimable 1567nr_slab_unreclaimable 8063nr_isolated_anon 0nr_isolated_file 0workingset_refault 14562813workingset_activate 2242125workingset_nodereclaim 996722nr_anon_pages 241753nr_mapped    5974nr_file_pages 184369nr_dirty     7nr_writeback 0nr_writeback_temp 0nr_shmem     11214nr_shmem_hugepages 0nr_shmem_pmdmapped 0nr_anon_transparent_hugepages 0nr_unstable  0nr_vmscan_write 815704nr_vmscan_immediate_reclaim 621726nr_dirtied   58545394nr_written   48579207pages free     15447min      2172low      2715high     3258spanned  49152

注:整理过程参考了很多博客和官方文档,不逐一列举了,只放重要参考:

Linux procfs内容大汇总(1) - 知乎

https://www.kernel.org/doc/Documentation/filesystems/proc.txt

Maintaining Linux man-pages

一文搞懂linux的proc文件相关推荐

  1. 一文搞懂Linux下的文件的标准输入、标准输出、输出重定向问题

    Linux下一切皆文件,所谓的终端那个黑框也可以视为一个文件,在Linux驱动开发中各个设备也可以被认为是文件操作,所以文件的操作很重要.我们通常将键盘叫做标准输入设备.将显示器叫做标准输出设备,下面 ...

  2. fseek linux 大文件_一文搞懂Linux系统开发

    文章目录 Linux系统开发会用到什么? C语言基础 shell脚本 慢慢学会使用Makefile 常规Linux系统编程知识都有什么?哪些常用?哪些不常用? 常规Linux编程知识 文件IO 文件与 ...

  3. 一文搞懂Linux系统开发

    列一下Linux系统开发要掌握的知识. 欢迎关注我的微信公众号:fensnote 文章目录 Linux系统开发会用到什么? C语言基础 shell脚本 学会使用Makefile 常规Linux系统编程 ...

  4. 一文搞懂Linux rm命令 删除文件/文件夹

    文章目录 一 rm命令简介 二 rm命令通用格式 三 使用示例 删除文件/文件夹 3.1 rm删除文件 3.2 rm删除文件夹 四 总结 一 rm命令简介 rm命令是Linux系统的一个命令.rm命令 ...

  5. 一文搞懂 | Linux 驱动的来龙去脉

    驱动相关的学习资料网上很多,但大部分都是碎片化的记录,很少有系统化的总结整理.本文旨在系统化的讲清楚 Linux 驱动的来龙去脉.先从总线,设备,驱动介绍内核对于驱动的模型设计:然后引入设备树的概念, ...

  6. 一文搞懂Go读写Excel文件

    先给大家看下我们今天的主角:一只可爱的囊地鼠正在准备食用Excel~ GitHub链接:https://github.com/qax-os/excelize Excelize是一个用纯Go语言编写的库 ...

  7. 一文搞懂Linux内核怎么提升UDP收包的效率

    现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPDK. 但是,即便Linux内核协议栈收包 ...

  8. 一文搞懂Linux 内存管理原理

    导语 linux 内存是后台开发人员,需要深入了解的计算机资源.合理的使用内存,有助于提升机器的性能和稳定性.本文主要介绍 linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,linux ...

  9. 一文搞懂 Linux TTY

    TTY的历史 TTY全称TeleTYpewriter,也即是电传打字机,它通过两根电缆连接计算机,一根用于向计算机发送指令,一根用于接收计算机的输出,输出结果是打印在纸上的 由于历史原因, Linux ...

最新文章

  1. HGOI 20190709 题解
  2. npm install --save和npm install --save-dev的区别
  3. Android——Fragment介绍
  4. ai人工智能编程_从人工智能动态编程:Q学习
  5. 猜数(二分、线段树)
  6. JVM优化系列-对象内存分配和回收的细节
  7. mysql 中文字段排序( 按拼音首字母排序) 的查询语句
  8. Dijkstra算法图文详解和C++代码
  9. Python中Socket粘包问题的解决
  10. CentOS出错You don#39;t have permission to access on this server
  11. WIBU-KEY加密狗驱动软件使用说明
  12. 桌面计算机图标变黑块,win7桌面图标变成有黑色方块怎么办?4个步骤轻松搞定...
  13. java -jar 命令隐藏黑窗口
  14. 初中计算机软件课后反思,信息技术的教学反思
  15. diy服务器个人主机_小型企业及个人用户入门级服务器DIY
  16. Tackling the Qubit Mapping Problem for NISQ-Era Quantum Devices
  17. 360断网急救箱 dns服务器未响应,发现DNS服务异常,用360断网急救箱修复后过一段时间又复发。怎么办?...
  18. 中国移动湖南公司2022校园春季招聘正在进行中
  19. win10更改账户/用户名称
  20. 驯龙高手java版_石器时代2驯龙高手

热门文章

  1. 基于PaddleX的智能零售柜商品识别
  2. 安卓定位方案的价格对比(包含可免费商用的服务)
  3. 无线通信——“互易”
  4. 小白的Node-Red学习系列
  5. 谷歌账号被强退,再次登录提示异常原因
  6. Segmentation-based deep-learning approach for surface-defectdetection(基于分割的表面缺陷深度学习检测方法)
  7. 关于列主元高斯消去法的matlab实现
  8. Java基础知识之什么是集合框架
  9. java处理字符串Patter与Matcher类与其方法详解
  10. Xendit获得1.5亿美元C轮融资,用于在东南亚构建数字支付基础设施