超级干货:3个性能监控和优化命令详解
点击上方“程序员大白”,选择“星标”公众号
重磅干货,第一时间送达
文章转载:高效运维
1 top命令
top [参数]命令参数:
- -b 批处理 
- -c 显示完整的治命令 
- -I 忽略失效过程 
- -s 保密模式 
- -S 累积模式 
- -i<时间> 设置间隔时间 
- -u<用户名> 指定用户名 
- -p<进程号> 指定进程 
- -n<次数> 循环显示的次数 
4.使用实例:
实例1:显示进程信息
命令:top
输出:
[root@TG1704 log]# toptop - 14:06:23 up 70 days, 16:44, 2 users, load average: 1.25, 1.32, 1.35Tasks: 206 total, 1 running, 205 sleeping, 0 stopped, 0 zombieCpu(s): 5.9%us, 3.4%sy, 0.0%ni, 90.4%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%stMem: 32949016k total, 14411180k used, 18537836k free, 169884k buffersSwap: 32764556k total, 0k used, 32764556k free, 3612636k cachedPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND28894 root 22 0 1501m 405m 10m S 52.2 1.3 2534:16 java18249 root 18 0 3201m 1.9g 11m S 35.9 6.0 569:39.41 java2808 root 25 0 3333m 1.0g 11m S 24.3 3.1 526:51.85 java25668 root 23 0 3180m 704m 11m S 14.0 2.2 360:44.53 java574 root 25 0 3168m 611m 10m S 12.6 1.9 556:59.63 java1599 root 20 0 3237m 1.9g 11m S 12.3 6.2 262:01.14 java1008 root 21 0 3147m 842m 10m S 0.3 2.6 4:31.08 java13823 root 23 0 3031m 2.1g 10m S 0.3 6.8 176:57.34 java28218 root 15 0 12760 1168 808 R 0.3 0.0 0:01.43 top29062 root 20 0 1241m 227m 10m S 0.3 0.7 2:07.32 java1 root 15 0 10368 684 572 S 0.0 0.0 1:30.85 init2 root RT -5 0 0 0 S 0.0 0.0 0:01.01 migration/03 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/04 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/05 root RT -5 0 0 0 S 0.0 0.0 0:00.80 migration/16 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/17 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/18 root RT -5 0 0 0 S 0.0 0.0 0:20.59 migration/29 root 34 19 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/210 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/211 root RT -5 0 0 0 S 0.0 0.0 0:23.66 migration/312 root 34 19 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/313 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/314 root RT -5 0 0 0 S 0.0 0.0 0:20.29 migration/415 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/416 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/417 root RT -5 0 0 0 S 0.0 0.0 0:23.07 migration/518 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/519 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/520 root RT -5 0 0 0 S 0.0 0.0 0:17.16 migration/621 root 34 19 0 0 0 S 0.0 0.0 0:00.05 ksoftirqd/622 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/623 root RT -5 0 0 0 S 0.0 0.0 0:58.28 migration/7
说明:
第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:
- 14:06:23:当前系统时间 
- up 70 days, 16:44:系统已经运行了70天16小时44分钟(在这期间系统没有重启过的吆!) 
- 2 users:当前有2个用户登录系统 
- load average: 1.15, 1.42, 1.44:load average 后面的三个数分别是1分钟、5分钟、15分钟的负载情况。 
- load average 数据是每隔 5 秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑 CPU 的数量,结果高于5的时候就表明系统在超负荷运转了。 
第二行,Tasks — 任务(进程),具体信息说明如下:
系统现在共有 206 个进程,其中处于运行中的有1个,205 个在休眠(sleep),stoped状态的有0个,zombie 状态(僵尸)的有0个。
- 5.9%us:用户空间占用CPU的百分比。 
- 3.4% sy:内核空间占用CPU的百分比。 
- 0.0% ni:改变过优先级的进程占用CPU的百分比 
- 90.4% id:空闲CPU百分比 
- 0.0% wa:IO等待占用CPU的百分比 
- 0.0% hi:硬中断(Hardware IRQ)占用CPU的百分比 
- 0.2% si:软中断(Software Interrupts)占用CPU的百分比 
- 32949016k total — 物理内存总量(32GB) 
- 14411180k used — 使用中的内存总量(14GB) 
- 18537836k free — 空闲内存总量(18GB) 
- 169884k buffers — 缓存的内存量 (169M) 
- 32764556k total — 交换区总量(32GB) 
- 0k used — 使用的交换区总量(0K) 
- 32764556k free — 空闲交换区总量(32GB) 
- 3612636k cached — 缓冲的交换区总量(3.6GB) 
- PID:进程id 
- USER:进程所有者 
- PR:进程优先级 
- NI:nice值。负值表示高优先级,正值表示低优先级 
- VIRT:进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES 
- RES:进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA 
- SHR:共享内存大小,单位kb 
- S:进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 
- %CPU:上次更新到现在的CPU时间占用百分比 
- %MEM:进程使用的物理内存百分比 
- TIME+:进程使用的CPU时间总计,单位1/100秒 
- COMMAND:进程名称(命令名/命令行) 



敲击键盘“x”(打开/关闭排序列的加亮效果),top的视图变化如下:

可以看到,top默认的排序列是“%CPU”。
4.通过”shift + >”或”shift + <”可以向右或左改变排序列
下图是按一次”shift + >”的效果图,视图现在已经按照%MEM来排序。
2、free 命令
free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。在Linux系统监控的工具中,free命令是最经常使用的命令之一。
free [参数]
free 命令显示系统使用和空闲的内存情况,包括物理内存、交互区内存(swap)和内核缓冲区内存。共享内存将被忽略
- -b 以Byte为单位显示内存使用情况。 
- -k 以KB为单位显示内存使用情况。 
- -m 以MB为单位显示内存使用情况。 
- -g 以GB为单位显示内存使用情况。 
- -o 不显示缓冲区调节列。 
- -s <间隔秒数> 持续观察内存使用状况。 
- -t 显示内存总和列。 
- -V 显示版本信息。 
freefree -gfree -m
输出:
[root@SF1150 service]# freetotal used free shared buffers cachedMem: 32940112 30841684 2098428 0 4545340 11363424-/+ buffers/cache: 14932920 18007192Swap: 32764556 1944984 30819572[root@SF1150 service]# free -gtotal used free shared buffers cachedMem: 31 29 2 0 4 10-/+ buffers/cache: 14 17Swap: 31 1 29[root@SF1150 service]# free -mtotal used free shared buffers cachedMem: 32168 30119 2048 0 4438 11097-/+ buffers/cache: 14583 17584Swap: 31996 1899 30097
说明:
- total:总计物理内存的大小。 
- used:已使用多大。 
- free:可用有多少。 
- Shared:多个进程共享的内存总额。 
- Buffers/cached:磁盘缓存的大小。 
- used:已使用多大。 
- free:可用有多少。 
18007156=2098428KB+4545340KB+11363424KB
命令:
cat /proc/meminfo
输出:
[root@SF1150 service]# cat /proc/meminfoMemTotal: 32940112 kBMemFree: 2096700 kBBuffers: 4545340 kBCached: 11364056 kBSwapCached: 1896080 kBActive: 22739776 kBInactive: 7427836 kBHighTotal: 0 kBHighFree: 0 kBLowTotal: 32940112 kBLowFree: 2096700 kBSwapTotal: 32764556 kBSwapFree: 30819572 kBDirty: 164 kBWriteback: 0 kBAnonPages: 14153592 kBMapped: 20748 kBSlab: 590232 kBPageTables: 34200 kBNFS_Unstable: 0 kBBounce: 0 kBCommitLimit: 49234612 kBCommitted_AS: 23247544 kBVmallocTotal: 34359738367 kBVmallocUsed: 278840 kBVmallocChunk: 34359459371 kBHugePages_Total: 0HugePages_Free: 0HugePages_Rsvd: 0Hugepagesize: 2048 kB
交换将通过三个途径来减少系统中使用的物理页面的个数: 
- 减少缓冲与页面cache的大小, 
- 将系统V类型的内存页面交换出去, 
- 换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。 
磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。
Page cache 实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当 page cache 的数据需要刷新时,page cache 中的数据交给 buffer cache,因为Buffer Cache 就是缓存磁盘块的。但是这种处理在 2.6 版本的内核之后就变的很简单了,没有真正意义上的 cache 操作。
所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了。这也是linux看内存是否够用的标准。
如果是应用服务器的话,一般只看第二行,+buffers/cache,即对应用程序来说free的内存太少了,也是该考虑优化程序或加内存了。
实例2:以总和的形式显示内存的使用信息
命令:
free -t
输出:
[root@SF1150 service]# free -ttotal used free shared buffers cachedMem: 32940112 30845024 2095088 0 4545340 11364324-/+ buffers/cache: 14935360 18004752Swap: 32764556 1944984 30819572Total: 65704668 32790008 32914660[root@SF1150 service]#
说明:
实例3:周期性的查询内存使用信息
命令:
free -s 10
[root@SF1150 service]# free -s 10total used free shared buffers cachedMem: 32940112 30844528 2095584 0 4545340 11364380-/+ buffers/cache: 14934808 18005304Swap: 32764556 1944984 30819572total used free shared buffers cachedMem: 32940112 30843932 2096180 0 4545340 11364388-/+ buffers/cache: 14934204 18005908Swap: 32764556 1944984 30819572
3、vmstat
我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。
1.命令格式:
free [参数]
2.命令功能:
free 命令显示系统使用和空闲的内存情况,包括物理内存、交互区内存(swap)和内核缓冲区内存。共享内存将被忽略
- -b 以Byte为单位显示内存使用情况。 
- -k 以KB为单位显示内存使用情况。 
- -m 以MB为单位显示内存使用情况。 
- -g 以GB为单位显示内存使用情况。 
- -o 不显示缓冲区调节列。 
- -s<间隔秒数> 持续观察内存使用状况。 
- -t 显示内存总和列。 
- -V 显示版本信息。 
实例1:显示内存使用情况
命令:
freefree -gfree -m
输出:
[root@SF1150 service]# freetotal used free shared buffers cachedMem: 32940112 30841684 2098428 0 4545340 11363424-/+ buffers/cache: 14932920 18007192Swap: 32764556 1944984 30819572[root@SF1150 service]# free -gtotal used free shared buffers cachedMem: 31 29 2 0 4 10-/+ buffers/cache: 14 17Swap: 31 1 29[root@SF1150 service]# free -mtotal used free shared buffers cachedMem: 32168 30119 2048 0 4438 11097-/+ buffers/cache: 14583 17584Swap: 31996 1899 30097
1.命令格式:
vmstat [-a] [-n] [-S unit] [delay [ count]]vmstat [-s] [-n] [-S unit]vmstat [-m] [-n] [delay [ count]]vmstat [-d] [-n] [delay [ count]]vmstat [-p disk partition] [-n] [delay [ count]]vmstat [-f]vmstat [-V]
2.命令功能:
用来显示虚拟内存的信息
3.命令参数:
- -a:显示活跃和非活跃内存 
- -f:显示从系统启动至今的fork数量 。 
- -m:显示slabinfo 
- -n:只在开始时显示一次各字段名称。 
- -s:显示内存相关统计信息及多种系统活动数量。 
- delay:刷新时间间隔。如果不指定,只显示一条结果。 
- count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。 
- -d:显示磁盘相关统计信息。 
- -p:显示指定磁盘分区统计信息 
- -S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes) 
- -V:显示vmstat版本信息。 
4.使用实例:
实例1:显示虚拟内存使用情况
命令:
vmstat
输出:
说明:
字段说明:
- Procs(进程): 
- r: 运行队列中进程数量 
- b: 等待IO的进程数量 
- Memory(内存): 
- swpd: 使用虚拟内存大小 
- free: 可用内存大小 
- buff: 用作缓冲的内存大小 
- cache: 用作缓存的内存大小 
Swap:
- si: 每秒从交换区写到内存的大小 
- so: 每秒写入交换区的内存大小 
- IO:(现在的Linux版本块的大小为1024bytes) 
- bi: 每秒读取的块数 
- bo: 每秒写入的块数 
系统:
- in: 每秒中断数,包括时钟中断。 
- cs: 每秒上下文切换数。 
- CPU(以百分比表示): 
- us: 用户进程执行时间(user time) 
- sy: 系统进程执行时间(system time) 
- id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。 
- wa: 等待IO时间 
vmstat 5 5表示在5秒时间内进行5次采样。将得到一个数据汇总他能够反映真正的系统情况。
实例2:显示活跃和非活跃内存
命令:
vmstat -a 2 5
输出:
[root@localhost ~]# vmstat -a 2 5procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------r b swpd free inact active si so bi bo in cs us sy id wa st 0 0 0 3029752 387728 513008 0 0 0 2 3 2 0 0 100 0 00 0 0 3029752 387728 513076 0 0 0 0 1005 34 0 0 100 0 00 0 0 3029752 387728 513076 0 0 0 22 1004 36 0 0 100 0 00 0 0 3029752 387728 513076 0 0 0 0 1004 33 0 0 100 0 00 0 0 3029752 387728 513076 0 0 0 0 1003 32 0 0 100 0 0
说明:
使用-a选项显示活跃和非活跃内存时,所显示的内容除增加inact和active外,其他显示内容与例子1相同。
字段说明:
- Memory(内存): 
- inact: 非活跃内存大小(当使用-a选项时显示) 
- active: 活跃的内存大小(当使用-a选项时显示) 
实例3:查看系统已经fork了多少次
命令:
vmstat -f
输出:
[root@SCF1129 ~]# vmstat -f12744849 forks[root@SCF1129 ~]#
说明:
这个数据是从/proc/stat中的processes字段里取得的
实例4:查看内存使用的详细信息
命令:
vmstat -s
输出:
[root@localhost ~]# vmstat -s 4043760 total memory1013884 used memory 513012 active memory 387728 inactive memory 3029876 free memory 199616 buffer memory 690980 swap cache 6096656 total swap 0 used swap 6096656 free swap 83587 non-nice user cpu ticks 132 nice user cpu ticks 278599 system cpu ticks 913344692 idle cpu ticks 814550 IO-wait cpu ticks 10547 IRQ cpu ticks 21261 softirq cpu ticks 0 stolen cpu ticks 310215 pages paged in14254652 pages paged out 0 pages swapped in0 pages swapped out 288374745 interrupts 146680577 CPU context switches 1351868832 boot time 367291 forks
说明:
这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat。
实例5:查看磁盘的读/写
命令:
vmstat -d
输出:
[root@localhost ~]# vmstat -ddisk- ------------reads------------ ------------writes----------- -----IO------total merged sectors ms total merged sectors ms cur secram0 0 0 0 0 0 0 0 0 0 0ram1 0 0 0 0 0 0 0 0 0 0ram2 0 0 0 0 0 0 0 0 0 0ram3 0 0 0 0 0 0 0 0 0 0ram4 0 0 0 0 0 0 0 0 0 0ram5 0 0 0 0 0 0 0 0 0 0ram6 0 0 0 0 0 0 0 0 0 0ram7 0 0 0 0 0 0 0 0 0 0ram8 0 0 0 0 0 0 0 0 0 0ram9 0 0 0 0 0 0 0 0 0 0ram10 0 0 0 0 0 0 0 0 0 0ram11 0 0 0 0 0 0 0 0 0 0ram12 0 0 0 0 0 0 0 0 0 0ram13 0 0 0 0 0 0 0 0 0 0ram14 0 0 0 0 0 0 0 0 0 0ram15 0 0 0 0 0 0 0 0 0 0sda 33381 6455 615407 63224 2068111 1495416 28508288 15990289 0 10491hdc 0 0 0 0 0 0 0 0 0 0fd0 0 0 0 0 0 0 0 0 0 0md0 0 0 0 0 0 0 0 0 0 0[root@localhost ~]#
说明:
这些信息主要来自于/proc/diskstats.
merged:表示一次来自于合并的写/读请求,一般系统会把多个连接/邻近的读/写请求合并到一起来操作.
实例6:查看/dev/sda1磁盘的读/写
命令:
输出:
[root@SCF1129 ~]# df文件系统 1K-块 已用 可用 已用% 挂载点/dev/sda3 1119336548 27642068 1034835500 3% /tmpfs 32978376 0 32978376 0% /dev/shm/dev/sda1 1032088 59604 920056 7% /boot[root@SCF1129 ~]# vmstat -p /dev/sda1sda1 reads read sectors writes requested writes 18607 4249978 6 48[root@SCF1129 ~]# vmstat -p /dev/sda3sda3 reads read sectors writes requested writes 429350 35176268 28998789 980301488[root@SCF1129 ~]#
说明:
这些信息主要来自于/proc/diskstats。
reads:来自于这个分区的读的次数。
read sectors:来自于这个分区的读扇区的次数。
writes:来自于这个分区的写的次数。
requested writes:来自于这个分区的写请求次数。
实例7:查看系统的 slab 信息
命令:
vmstat -m
输出:
[root@localhost ~]# vmstat -mCacheNum Total Size Pagesip_conntrack_expect 0 0 136 28ip_conntrack 3 13 304 13ip_fib_alias 11 59 64 59ip_fib_hash 11 59 64 59AF_VMCI 0 0 960 4bio_map_info 100 105 1064 7dm_mpath 0 0 1064 7jbd_4k 0 0 4096 1dm_uevent 0 0 2608 3dm_tio 0 0 24 144dm_io 0 0 48 77scsi_cmd_cache 10 10 384 10sgpool-128 32 32 4096 1sgpool-64 32 32 2048 2sgpool-32 32 32 1024 4sgpool-16 32 32 512 8sgpool-8 45 45 256 15scsi_io_context 0 0 112 34ext3_inode_cache 51080 51105 760 5ext3_xattr 36 88 88 44journal_handle 18 144 24 144journal_head 56 80 96 40revoke_table 4 202 16 202revoke_record 0 0 32 112uhci_urb_priv 0 0 56 67UNIX 13 33 704 11flow_cache 0 0 128 30msi_cache 33 59 64 59cfq_ioc_pool 14 90 128 30cfq_pool 12 90 216 18crq_pool 16 96 80 48deadline_drq 0 0 80 48as_arq 0 0 96 40mqueue_inode_cache 1 4 896 4isofs_inode_cache 0 0 608 6hugetlbfs_inode_cache 1 7 576 7Cache Num Total Size Pagesext2_inode_cache 0 0 720 5ext2_xattr 0 0 88 44dnotify_cache 0 0 40 92dquot 0 0 256 15eventpoll_pwq 3 53 72 53eventpoll_epi 3 20 192 20inotify_event_cache 0 0 40 92inotify_watch_cache 1 53 72 53kioctx 0 0 320 12kiocb 0 0 256 15fasync_cache 0 0 24 144shmem_inode_cache 254 290 768 5posix_timers_cache 0 0 128 30uid_cache 0 0 128 30ip_mrt_cache 0 0 128 30tcp_bind_bucket 3 112 32 112inet_peer_cache 0 0 128 30secpath_cache 0 0 64 59xfrm_dst_cache 0 0 384 10ip_dst_cache 5 10 384 10arp_cache 1 15 256 15RAW 3 5 768 5UDP 5 10 768 5tw_sock_TCP 0 0 192 20request_sock_TCP 0 0 128 30TCP 4 5 1600 5blkdev_ioc 14 118 64 59blkdev_queue 20 30 1576 5blkdev_requests 13 42 272 14biovec-256 7 7 4096 1biovec-128 7 8 2048 2biovec-64 7 8 1024 4biovec-16 7 15 256 15biovec-4 7 59 64 59biovec-1 23 202 16 202bio 270 270 128 30utrace_engine_cache 0 0 64 59Cache Num Total Size Pagesutrace_cache 0 0 64 59sock_inode_cache 33 48 640 6skbuff_fclone_cache 7 7 512 7skbuff_head_cache 319 390 256 15file_lock_cache 1 22 176 22Acpi-Operand 4136 4248 64 59Acpi-ParseExt 0 0 64 59Acpi-Parse 0 0 40 92Acpi-State 0 0 80 48Acpi-Namespace 2871 2912 32 112delayacct_cache 81 295 64 59taskstats_cache 4 53 72 53proc_inode_cache 1427 1440 592 6sigqueue 0 0 160 24radix_tree_node 13166 13188 536 7bdev_cache 23 24 832 4sysfs_dir_cache 5370 5412 88 44mnt_cache 26 30 256 15inode_cache 2009 2009 560 7dentry_cache 60952 61020 216 18filp 479 1305 256 15names_cache 3 3 4096 1avc_node 14 53 72 53selinux_inode_security 994 1200 80 48key_jar 2 20 192 20idr_layer_cache 74 77 528 7buffer_head 164045 164800 96 40mm_struct 51 56 896 4vm_area_struct 1142 1958 176 22fs_cache 35 177 64 59files_cache 36 55 768 5signal_cache 72 162 832 9sighand_cache 68 84 2112 3task_struct 76 80 1888 2anon_vma 458 864 24 144pid 83 295 64 59shared_policy_node 0 0 48 77Cache Num Total Size Pagesnuma_policy 37 144 24 144size-131072(DMA) 0 0 131072 1size-131072 0 0 131072 1size-65536(DMA) 0 0 65536 1size-65536 1 1 65536 1size-32768(DMA) 0 0 32768 1size-32768 2 2 32768 1size-16384(DMA) 0 0 16384 1size-16384 5 5 16384 1size-8192(DMA) 0 0 8192 1size-8192 7 7 8192 1size-4096(DMA) 0 0 4096 1size-4096 110 111 4096 1size-2048(DMA) 0 0 2048 2size-2048 602 602 2048 2size-1024(DMA) 0 0 1024 4size-1024 344 352 1024 4size-512(DMA) 0 0 512 8size-512 433 480 512 8size-256(DMA) 0 0 256 15size-256 1139 1155 256 15size-128(DMA) 0 0 128 30size-64(DMA) 0 0 64 59size-64 5639 5782 64 59size-32(DMA) 0 0 32 112size-128 801 930 128 30size-32 3005 3024 32 112kmem_cache 137 137 2688 1
推荐阅读
关于程序员大白
程序员大白是一群哈工大,东北大学,西湖大学和上海交通大学的硕士博士运营维护的号,大家乐于分享高质量文章,喜欢总结知识,欢迎关注[程序员大白],大家一起学习进步!


