本文是史上最全的高可用服务系统线上问题排查工具单(一)的第2篇,侧重于命令在特定场景下如何帮助应急人员和攻关人员定位问题并解决问题,因此,对于每个命令的介绍将直切主题,直接介绍命令使用的具体场景,而不是介绍命令的详细使用格式。
/Proc文件系统
_____
Linux系统内核提供了通过/proc文件系统查看运行时内核内部数据结构的能力,也可以改变内核参数设置。
显示CPU信息:
cat /proc/cpuinfo
显示内存信息:
cat /proc/meminfo
显示详细的内存映射信息:
cat /proc/zoneinfo
显示磁盘映射信息:
cat /proc/mounts
查看系统平均负载命令:
cat /proc/loadavg
性能和压测工具
_____
1、ab
ab是一款针对HTTP协议实现的服务进行性能压测的工具,它本来是设计用来测量apache服务器的性能指标,特别是测试阿帕奇服务器每秒能够处理多少请求的指标,以及响应的时间等,但是此命令也可以用来测试一切通用的HTTP协议服务器的性能。
测量HTTP GET协议的接口:
robert@robert-ubuntu1410:~$ ab -c10 -n100000 "http://localhost:8080/genid"
This is ApacheBench, Version 2.3 <$Revision:1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests
Server Software: Apache-Coyote/1.1
Server Hostname: localhost
Server Port: 8080
Document Path: /genid
Document Length: 19 bytes
Concurrency Level: 10
Time taken for tests: 30.728 seconds
Complete requests: 100000
Failed requests: 0
Total transferred: 16700000 bytes
HTML transferred: 1900000 bytes
Requests per second: 3254.33 [#/sec] (mean)
Time per request: 3.073 [ms] (mean)
Time per request: 0.307 [ms] (mean, across all concurrent requests)
Transfer rate: 530.74 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.8 0 24
Processing: 0 3 3.1 2 88
Waiting: 0 2 2.7 1 80
Total: 0 3 3.3 2 88
Percentage of the requests served within a certain time (ms)
50% 2
66% 3
75% 4
80% 4
90% 6
95% 9
98% 13
99% 16
100% 88 (longest request)
从输出中可以看出,开源的Vesta发号器QPS达到3254.33,平均响应时间是3毫秒,所有请求在88毫秒内返回,99%的请求在16毫秒返回。
也可以对使用POST协议的服务进行压测:
ab -c 10 -n 1000 -p post -T 'application/x-www-form-urlencoded' http://localhost:8080/billing/account/update
POST文件内容:
accountId=1149983321489408&clientDesc=1
2、jmeter
jmeter是apache组织开发的基于Java的性能压力测试工具。用于对Java开发的软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到通用的性能测试领域。它可以用于测试静态和动态资源,例如静态文件、Java Applet、CGI脚本、Java类库、数据库、FTP服务器,HTTP服务器等等。
jmeter可以用于对服务器、网络或对象模拟巨大的负载,在不同类别的压力下,测试它们的强度和分析整体性能。另外,jmeter能够对应用程序做功能和回归测试,通过创建带有断言的脚本来自动化的验证你的程序满足你期望的结果。为了最大限度的灵活性,jmeter允许使用正则表达式创建断言。
jemeter是一个复杂性能测试工具和平台,开发者需要在自己的平台下集成jmeter,并且开发jemeter的测试用例才能使用,本文不对jmeter做展开,读者可自行通过阅读jmeter主页的文档学习。
3、mysqlslap
这是mysql自带的一款性能压测工具,通过模拟多个并发客户端访问mysql来执行压力测试,同时提供了详细的的数据性能报告。此工具可以自动生成测试表和数据,并且可以模拟读、写、混合读写、查询等不同的使用场景,并且能够很好的对比多个存储引擎在相同环境下的并发压力下性能上的差别。
1 )使用单线程测试
使用方式:
mysqlslap -a -uroot -pyouarebest
命令输出:
robert@robert-ubuntu1410:~$ mysqlslap -a -uroot -pyouarebest
Benchmark
Average number of seconds to run all queries:0.108 seconds
Minimum number of seconds to run all queries:0.108 seconds
Maximum number of seconds to run all queries:0.108 seconds
Number of clients running queries:1
Average number of queries per client:0
这里可以看到,使用单线程连接一次服务器需要108毫秒。
2 )使用100个多线程测试
使用方式:
mysqlslap -a -c 100 -uroot -pyouarebest
命令输出:
robert@robert-ubuntu1410:~$ mysqlslap -a -c 100 -uroot -pyouarebest
Benchmark
Average number of seconds to run all queries:0.504 seconds
Minimum number of seconds to run all queries:0.504 seconds
Maximum number of seconds to run all queries:0.504 seconds
Number of clients running queries:100
Average number of queries per client:0
这里可以看到,使用多线程连接一次服务器需要504毫秒/100,大约为5毫秒,可见增加并发提高了吞吐量指标。
3) 多次测试对测试结果求平均值
使用方式:
mysqlslap -a -i 10 -uroot -pyouarebest
命令输出:
robert@robert-ubuntu1410:~$ mysqlslap -a -i 10 -uroot -pyouarebest
Benchmark
Average number of seconds to run all queries:0.108 seconds
Minimum number of seconds to run all queries:0.098 seconds
Maximum number of seconds to run all queries:0.132 seconds
Number of clients running queries:1
Average number of queries per client:0
这里可以看到,多次测试求平均值,可以看到不同次的测试的结果稍有不同,平均为108ms,这与第一个测试结果是相同的。
4) 测试读操作的性能指标
使用方式:
mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=read -uroot -pyouarebest
命令输出:
robert@robert-ubuntu1410:~$ mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=read -uroot -pyouarebest
Benchmark
Average number of seconds to run all queries:0.048 seconds
Minimum number of seconds to run all queries:0.048 seconds
Maximum number of seconds to run all queries:0.048 seconds
Number of clients running queries:10
Average number of queries per client:100
可以算出,平均每个查询需要48毫秒/1000,为0.048毫秒。数据库服务器处理SQL的QPS为1000/0.048秒, 平均QPS为20833次/每秒。
5) 测试写操作的性能指标
使用方式:
mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=write -uroot -pyouarebest
命令输出:
robert@robert-ubuntu1410:~$ mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=write -uroot -pyouarebest
Benchmark
Average number of seconds to run all queries:3.460 seconds
Minimum number of seconds to run all queries:3.460 seconds
Maximum number of seconds to run all queries:3.460 seconds
Number of clients running queries:10
Average number of queries per client:100
可以算出,平均每个写操作需要3460毫秒/1000,为3.4毫秒。数据库服务器处理SQL的QPS为1000/3.46秒, 平均QPS为289次/每秒。
6) 测试读写混合操作的性能指标
使用方式:
mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=mixed -uroot -pyouarebest
命令输出:
robert@robert-ubuntu1410:~$ mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=mixed -uroot -pyouarebest
Benchmark
Average number of seconds to run all queries:1.944 seconds
Minimum number of seconds to run all queries:1.944 seconds
Maximum number of seconds to run all queries:1.944 seconds
Number of clients running queries:10
Average number of queries per client:100
可以算出,平均每个读或写操作需要1944毫秒/1000,为1.9毫秒。数据库服务器处理SQL的QPS为1000/1.944秒, 平均QPS为514次/每秒。
7) 多次不同并发数混合操作的性能指标
测试不同的存储引擎的性能进行对比,执行一次测试,分别50和100个并发,共执行1000次总查询,50和100个并发分别得到一次测试结果,并发数越多,执行完所有查询的时间越长,为了准确起见,可以多次迭代测试后求多次平均值。
使用方式:
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info --engine=myisam,innodb --iterations=5 -uroot -pyouarebest
命令输出:
robert@robert-ubuntu1410:~$ mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info --engine=myisam,innodb --iterations=5 -uroot -pyouarebest
Benchmark
Running for engine myisam
Average number of seconds to run all queries:0.080 seconds
Minimum number of seconds to run all queries:0.070 seconds
Maximum number of seconds to run all queries:0.106 seconds
Number of clients running queries:50
Average number of queries per client:20
Benchmark
Running for engine myisam
Average number of seconds to run all queries:0.100 seconds
Minimum number of seconds to run all queries:0.075 seconds
Maximum number of seconds to run all queries:0.156 seconds
Number of clients running queries:100
Average number of queries per client:10
Benchmark
Running for engine innodb
Average number of seconds to run all queries:0.527 seconds
Minimum number of seconds to run all queries:0.437 seconds
Maximum number of seconds to run all queries:0.801 seconds
Number of clients running queries:50
Average number of queries per client:20
Benchmark
Running for engine innodb
Average number of seconds to run all queries:0.608 seconds
Minimum number of seconds to run all queries:0.284 seconds
Maximum number of seconds to run all queries:0.991 seconds
Number of clients running queries:100
Average number of queries per client:10
User time 0.85, System time 1.28
Maximum resident set size 14200, Integral resident set size 0
Non-physical pagefaults 36206, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 61355, Involuntary context switches 1244
从这次测试可以看到,并发数增多,由于有并发就有同步操作的损耗,100并发的响应时间性能指标要略小于50并发的性能指标。
4、sysbench
1) CPU性能测试
使用方式:
sysbench --test=cpu --cpu-max-prime=20000 run
命令输出:
robert@robert-ubuntu1410:~$ sysbench --test=cpu --cpu-max-prime=20000 run
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads:1
Doing CPU performance benchmark
Threads started!
Done.
Maximum prime number checked in CPU test:20000
Test execution summary:
total time: 26.0836s
total number of events: 10000
total time taken by event execution:26.0795
per-request statistics:
min: 2.41ms
avg: 2.61ms
max: 6.29ms
approx. 95 percentile: 2.93ms
Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 26.0795/0.00
从这里可以看出做一次素数加法运算平均时间是2.61毫秒。
2 )线程锁性能测试
使用方式:
robert@robert-ubuntu1410:~$ sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run
命令输出:
robert@robert-ubuntu1410:~$ sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads:64
Doing thread subsystem performance test
Thread yields per test:100 Locks used:2
Threads started!
Done.
Test execution summary:
total time: 0.6559s
total number of events: 10000
total time taken by event execution:41.5442
per-request statistics:
min: 0.02ms
avg: 4.15ms
max: 114.28ms
approx. 95 percentile: 23.35ms
Threads fairness:
events (avg/stddev): 156.2500/36.13
execution time (avg/stddev): 0.6491/0.00
可见,在64个线程中,每个线程yield 100次,并且上锁2次,每次事件需要4毫秒的时间。
3) 磁盘随机IO性能测试
用sysbench工具可以测试顺序读,顺序写,随机读,随机写等磁盘IO性能:
sysbench --test=fileio --file-num=16 --file-total-size=100M prepare
sysbench --test=fileio --file-total-size=100M --file-test-mode=rndrd --max-time=180 --max-requests=100000000 --num-threads=16 --init-rng=on --file-num=16 --file-extra-flags=direct --file-fsync-freq=0 --file-block-size=16384 run
sysbench --test=fileio --file-num=16 --file-total-size=2G cleanup
命令输出:
robert@robert-Latitude-E6440:~/tmp$ sysbench --test=fileio --file-num=16 --file-total-size=100M prepare
sysbench 0.4.12: multi-threaded system evaluation benchmark
16 files, 6400Kb each, 100Mb total
Creating files for the test...
robert@robert-Latitude-E6440:~/tmp$ sysbench --test=fileio --file-total-size=100M --file-test-mode=rndrd --max-time=180 --max-requests=100000000 --num-threads=16 --init-rng=on --file-num=16 --file-extra-flags=direct --file-fsync-freq=0 --file-block-size=16384 run
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads:16
Initializing random number generator from timer.
Extra file open flags:16384
16 files, 6.25Mb each
100Mb total file size
Block size 16Kb
Number of random requests for random IO:100000000
Read/Write ratio for combined random IO test:1.50
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random read test
Threads started!
Time limit exceeded, exiting...
(last message repeated 15 times)
Done.
Operations performed: 43923 Read, 0 Write, 0 Other = 43923 Total
Read 686.3Mb Written 0b Total transferred 686.3Mb (3.8104Mb/sec)
243.86 Requests/sec executed
Test execution summary:
total time: 180.1126s
total number of events: 43923
total time taken by event execution:2880.7789
per-request statistics:
min: 0.13ms
avg: 65.59ms
max: 1034.24ms
approx. 95 percentile: 223.33ms
Threads fairness:
events (avg/stddev): 2745.1875/64.44
execution time (avg/stddev): 180.0487/0.03
robert@robert-Latitude-E6440:~/tmp$ sysbench --test=fileio --file-num=16 --file-total-size=2G cleanup
sysbench 0.4.12: multi-threaded system evaluation benchmark
Removing test files...
上面测试显示,这台机器随机IO速度3M/s,IOPS高达243.86。
4 )内存性能测试
使用方式:
robert@robert-ubuntu1410:~$ sysbench --test=memory --memory-block-size=16k --memory-total-size=16K run
命令输出:
由于虚拟机有问题,没有收集到这部分的输出信息 :(
4) MYSQL事务性操作测试
由于prepare阶段不能自动创建schema,需要手工预先创建测试使用的schema,并且使用--mysql-db=test来指定。
使用方式:
sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=1000 --mysql-user=root --mysql-host=localhost --mysql-password=youarebest --mysql-db=test run
命令输出:
robert@robert-ubuntu1410:/etc/mysql$ sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=1000 --mysql-user=root --mysql-host=localhost --mysql-password=youarebest --mysql-db=test prepare
sysbench 0.4.12: multi-threaded system evaluation benchmark
No DB drivers specified, using mysql
Creating table 'sbtest'...
Creating 1000 records in table 'sbtest'...
robert@robert-ubuntu1410:/etc/mysql$ sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=1000 --mysql-user=root --mysql-host=localhost --mysql-password=youarebest --mysql-db=test run
sysbench 0.4.12: multi-threaded system evaluation benchmark
No DB drivers specified, using mysql
Running the test with following options:
Number of threads:1
Doing OLTP test.
Running mixed OLTP test
Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases)
Using "LOCK TABLES WRITE" for starting transactions
Using auto_inc on the id column
Maximum number of requests for OLTP test is limited to 10000
Threads started!
Done.
OLTP test statistics:
queries performed:
read: 140000
write: 50000
other: 20000
total: 210000
transactions: 10000 (689.49 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 190000 (13100.32 per sec.)
other operations: 20000 (1378.98 per sec.)
Test execution summary:
total time: 14.5035s
total number of events: 10000
total time taken by event execution:14.4567
per-request statistics:
min: 0.92ms
avg: 1.45ms
max: 19.34ms
approx. 95 percentile: 2.52ms
Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 14.4567/0.00
robert@robert-ubuntu1410:/etc/mysql$ sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=1000 --mysql-user=root --mysql-host=localhost --mysql-password=youarebest --mysql-db=test cleanup
sysbench 0.4.12: multi-threaded system evaluation benchmark
No DB drivers specified, using mysql
Dropping table 'sbtest'...
Done.
从测试结果中得出事务TPS为689次/秒,读写的QPS为13100次/秒,每个请求处理的平均时间是1.45毫秒。
5、dd
dd可以用于测试磁盘顺序IO的存取速度,在应用场景中,打印日志通常表现为顺序IO的写操作,而数据库查询多为磁盘随机IO。
在磁盘上放一个文件,然后使用如下命令:
dd if=/home/robert/test-file of=/dev/null bs=512 count=10240000
从结果中就能看出这个磁盘的顺序IO的读取速度:
robert@robert-Latitude-E6440:~/working/multimedia-test$ dd if=./bigfile.tar of=/dev/null bs=512 count=10240000
记录了160+0 的读入
记录了160+0 的写出
81920字节(82 kB)已复制,0.0277534 秒,3.0 MB/秒
robert@robert-Latitude-E6440:~/working/multimedia-test$ dd if=./bigfile.tar of=/dev/null bs=512 count=10240000
记录了160+0 的读入
记录了160+0 的写出
81920字节(82 kB)已复制,0.000345242 秒,237 MB/秒
robert@robert-Latitude-E6440:~/working/multimedia-test$ dd if=./bigfile.tar of=/dev/null bs=512 count=10240000
记录了160+0 的读入
记录了160+0 的写出
81920字节(82 kB)已复制,0.000238306 秒,344 MB/秒
从上面的测试中发现,文件的顺序读取可以达到上百兆字节,第一次只有3兆,这是因为第一次操作系统的IO缓存没有命中导致的。普通x86机器上顺序读在100M左右,IBM或者华为的高端机器可以达到1G/s。
摘要命令
_____
1、md5sum
用于生成md5摘要,通常用于文件上传和下载操作校验内容的正确性,或者通过加盐的hmac做对称数据签名。
为文件生成md5摘要:
robert@robert-ubuntu1410:~$ md5sum test.txt
23cdc18507b52418db7740cbb5543e54 test.txt
2、sha256
由于md5摘要算法可以通过碰撞的方法进行破解,虽然,碰撞后数据还能符合业务规则的可能性比较小,但是安全无小事,大家都倾向于使用更安全的sha256算法。
通常也用于文件上传和下载操作校验正确性,或者通过加盐的sha256-hmac做对称数据签名。
为文件生成sha256摘要:
robert@robert-ubuntu1410:~$ sha256sum test.txt
2634c3097f98e36865f0c572009c4ffd73316bc8b88ccfe8d196af35f46e2394 test.txt
3、base64
base64编码是网络上最常见的用于传输8位字节代码的编码方式之一,这种编码可以保证所输出的编码位全都是可读字符,base64制定了一个编码表,以便进行统一转换。编码表共有64个字符,因此称为base64编码。
base64编码把3个8位字节(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形式。如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1个或者2个'='。
把文件内容转化成base64编码:
robert@robert-ubuntu1410:~$ base64 test.txt
MTIzNDU2NzgK
另外,区块链里面存储秘钥的时候并没有使用base64编码,而是使用了base58编码,去除了肉眼容易混淆的可见字符,例如:去除了'I',因为它和数字'1'相似,去掉了字母'o',因为它和数字0相似,从这里可以看到一款产品是如何从用户的角度思考和设计的。
命令与场景汇总表
_____
本节把本文中介绍的所有的命令收集在一个表格中,称为“命令与场景汇总表”,便于大家随时参考和使用,并推荐大家把这个表格打印出来放在自己的办公桌上,需要的时候看一眼,便可快速发现和解决问题的命令和工具。
序号 | 命令 | 使用场景 |
---|---|---|
1 | grep | 超级强悍的文本查找命令,常用于在大量文件中查找相关的关键词 |
2 | find | 查找某些文件,常用来在众多项目中根据文件名查找某些文件 |
3 | uptime | 查看操作系统启动的时间、用户、负载等 |
4 | lsof | 查看某个进程打开的文件句柄 |
5 | ulimit | 查看系统配置的用户对资源使用的限制,例如:打开的最大文件句柄、创建的最大线程数等 |
6 | curl | 模拟HTTP协议调用 |
7 | scp | 从服务器上下载文件或者上传文件到服务器上 |
8 | vi/vim | 在服务器上编辑文件,或者作为开发脚本程序的编辑环境 |
9 | dos2unix & unix2dos | 转换windows和unix/linux的换行符 |
10 | ps | 查看系统内进程列表,并可以看到内存、CPU的信息 |
11 | top | 按照资源使用情况排序显示系统内进程的列表 |
12 | free | 查看系统的内存使用情况 |
13 | pmap | 查看进程详细的内存分配情况 |
14 | vmstat | 查看系统的CPU利用率、负载、内存等信息 |
15 | mpstat | 查看系统的CPU利用率、负载,并可以按照CPU核心分别显示信息 |
16 | iostat | 查看磁盘IO的信息以及传输速度 |
17 | swapon | 查看系统的交换区的使用情况 |
18 | df | 显示磁盘挂载的信息 |
19 | ifconfig | 显示网卡挂载的信息 |
20 | ping | 检测服务器到其他服务器网络连接情况 |
21 | telnet | 可以检测某一个服务器的端口是否在正常对外服务 |
22 | nc | 模拟开启TCP/IP的服务器,通常用于拦截HTTP协议传递的参数,帮助定位Restful服务的问题 |
23 | mtr | 检测网络连通性问题,并可以获取某一个域名或者IP的丢包率 |
24 | nslookup | 判断DNS是否能够正确解析域名,以及域名解析到哪个IP地址 |
25 | traceroute | 跟踪网络传输的详细路径,显示每一级网关的信息 |
26 | sar | 全面的监控网络、磁盘、CPU、内存等信息的轻量级工具 |
27 | netstat(ss) | 通常用于查看网络端口的连接情况 |
28 | iptraf | 用来获得网络IO的传输速度以及其他的网络状态信息 |
29 | tcpdump | 可以拦截本机网卡任何协议的通讯内容,用来调试网络问题 |
30 | nmap | 扫描某一服务器打开的端口 |
31 | pstack | 打印进程内调用堆栈 |
32 | strace | 跟踪进程内工作机制 |
33 | /Proc文件系统 | 另外一种方法实时查看系统的CPU、内存、IO等信息 |
34 | ab | 简单好用的HTTP协议的压测工具 |
35 | jmeter | 用于复杂的Java程序的测试工具 |
36 | mysqlslap | 用于测试mysql性能的弓弩 |
37 | sysbench | 可以用于测试系统IO、网络、CPU、内存等的性能指标,也可以用来测试mysql的各项性能指标 |
38 | dd | 磁盘文件拷贝操作 |
39 | md5sum | 生成md5摘要 |
40 | sha256 | 生成sha256摘要 |
41 | base64 | 生成base64编码 |
总结经验
_____
本文全面介绍了线上应急和技术攻关必不可少的基础Linux命令和工具,包括:查看活动进程的命令、内存监控命令、CPU使用情况监控命令、磁盘IO监控命令、网络查看和监控命令、Linux系统高级工具、Proc文件系统、性能压测工具、生成摘要的命令和工具等。
在文章末尾,对本文介绍的命令进行了总结,并且汇入了一个表格,表格可以用来帮助查找不同场景使用哪些命令能够解决特定的问题,读者可以把此表格打印出来,放在桌面上,需要的时候瞄一眼,就可以找到相应命令来定位问题。
- End -
本文分享自微信公众号 - IT一刻钟(it_info)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。