市场大部分服务都运行Linux之上,开发过程中难免需要到服务器上查看服务日志,环境部署,排查问题等。操作系统是计算机科学都要接触的基本概念,抛开那些纯理论的操作系统底层实现,在Linux下做软件开发这么多年,每次程序运行出现问题,都要一步一步分析进程各种状态,去排查问题出在哪里。这里总结一下开发常用的Linux命令,以便日后方便查阅
本文命令以CentOS release 7.6.1810
版本为准,下面分几大类总结开发过程中常用的命令
进程
在服务器上我们常需要查看进程的CPU,内存使用情况,获取进程的PID。线程是操作操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位,一个进程内可以包含多个线程,是资源调度的最小单位
PS
ps命令是Process Status的缩写, 用来列出系统中当前运行的那些进程. ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令
ps -ef :用于列出系统中所有运行的进程,如果需要查看 Java进程可通过 grep进行过滤
[root@VM_0_3_centos /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2019 ? 00:00:01 /sbin/init
root 2 0 0 2019 ? 00:00:01 [kthreadd]
root 3 2 0 2019 ? 00:07:27 [ksoftirqd/0]
root 5 2 0 2019 ? 00:00:00 [kworker/0:0H]
root 7 2 0 2019 ? 00:00:00 [migration/0]
root 8 2 0 2019 ? 00:00:00 [rcu_bh]
root 9 2 0 2019 ? 00:19:41 [rcu_sched]
root 10 2 0 2019 ? 00:00:00 [lru-add-drain]
root 11 2 0 2019 ? 00:01:22 [watchdog/0]
root 13 2 0 2019 ? 00:00:00 [kdevtmpfs]
root 14 2 0 2019 ? 00:00:00 [netns]
root 15 2 0 2019 ? 00:00:03 [khungtaskd]
root 16 2 0 2019 ? 00:00:00 [writeback]
root 17 2 0 2019 ? 00:00:00 [kintegrityd]
root 18 2 0 2019 ? 00:00:00 [bioset]
root 19 2 0 2019 ? 00:00:00 [bioset]
[root@VM_0_3_centos /]# ps -ef|grep java
root 2415 29781 0 22:56 pts/0 00:00:00 grep --color=auto java
root 11115 1 0 2019 ? 04:33:17 java -jar spring-boot-demo-1.0-SNAPSHOT.jar
ps -aux:列出目前所有的正在内存当中的程序
[root@VM_0_3_centos /]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 43504 2652 ? Ss 2019 26:10 /sbin/init
root 2 0.0 0.0 0 0 ? S 2019 0:01 [kthreadd]
root 3 0.0 0.0 0 0 ? S 2019 7:27 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 2019 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 2019 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 2019 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 2019 19:41 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 2019 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 2019 1:22 [watchdog/0]
root 13 0.0 0.0 0 0 ? S 2019 0:00 [kdevtmpfs]
root 14 0.0 0.0 0 0 ? S< 2019 0:00 [netns]
pstree
pstree按树形结构打印运行中进程结构信息,可以直观的查看进程和它启动的线程的关系,并能显示进程标识。例如查看服务器上运行的 Java进程,通过 ps -ef|grep java
得到 Java进程的PID是 11115
[root@VM_0_3_centos /]# pstree -p 11115
java(11115)─┬─{java}(11116)
├─{java}(11117)
├─{java}(11118)
├─{java}(11119)
├─{java}(11120)
├─{java}(11121)
├─{java}(11122)
├─{java}(11123)
├─{java}(11124)
├─{java}(11150)
├─{java}(11152)
├─{java}(11153)
├─{java}(11156)
├─{java}(11157)
├─{java}(11158)
├─{java}(11159)
├─{java}(11160)
├─{java}(11161)
├─{java}(11162)
├─{java}(11163)
├─{java}(11164)
├─{java}(11165)
├─{java}(11166)
├─{java}(11167)
└─{java}(11168)
可以看到在PID为11115进程中有25个线程,并且显示了线程的PID
pstack
打印出运行中程序的堆栈信息。执行命令pstack pid
你能看到当前线程运行中的堆栈信息,其中的pid可用之前的ps
命令获得,pstack
可以看到进程内启动的线程号,每个进程内线程的「堆栈」内容也能看到。我们同样查看Java进程的堆栈信息
[root@VM_0_3_centos /]# pstack 11115
Thread 26 (Thread 0x7f0b260f1700 (LWP 11116)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e053ab in os::PlatformEvent::park() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24dba529 in Monitor::IWait(Thread*, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#3 0x00007f0b24dbb950 in Monitor::wait(bool, long, bool) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#4 0x00007f0b24f6aff1 in Threads::destroy_vm() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#6 0x00007f0b25ab1418 in JavaMain () from /user/java/jdk1.8.0_221/bin/../lib/amd64/jli/libjli.so
#7 0x00007f0b25cc8dd5 in start_thread () from /lib64/libpthread.so.0
#8 0x00007f0b255d5ead in clone () from /lib64/libc.so.6
Thread 25 (Thread 0x7f0b0f7f0700 (LWP 11117)):
#0 0x00007f0b25cccd12 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24dface7 in os::PlatformEvent::park(long) [clone .part.33] () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24dba614 in Monitor::IWait(Thread*, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#3 0x00007f0b24dbba8a in Monitor::wait(bool, long, bool) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#4 0x00007f0b24fc7922 in VMThread::loop() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#5 0x00007f0b24fc7eb8 in VMThread::run() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#7 0x00007f0b25cc8dd5 in start_thread () from /lib64/libpthread.so.0
#8 0x00007f0b255d5ead in clone () from /lib64/libc.so.6
Thread 24 (Thread 0x7f0b0f6ef700 (LWP 11118)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e053ab in os::PlatformEvent::park() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24de92d5 in ObjectMonitor::wait(long, bool, Thread*) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#3 0x00007f0b24be29b8 in JVM_MonitorWait () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#32 0x0000000000000000 in ?? ()
Thread 23 (Thread 0x7f0b0f5ee700 (LWP 11119)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e053ab in os::PlatformEvent::park() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24de92d5 in ObjectMonitor::wait(long, bool, Thread*) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#3 0x00007f0b24be29b8 in JVM_MonitorWait () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#6 0x0000000000000000 in ?? ()
Thread 22 (Thread 0x7f0b0f4ed700 (LWP 11120)):
#0 0x00007f0b25cceadb in do_futex_wait.constprop.1 () from /lib64/libpthread.so.0
#1 0x00007f0b25cceb6f in __new_sem_wait_slow.constprop.0 () from /lib64/libpthread.so.0
#2 0x00007f0b25ccec0b in sem_wait@@GLIBC_2.2.5 () from /lib64/libpthread.so.0
#3 0x00007f0b24dfb2d5 in check_pending_signals(bool) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#4 0x00007f0b24df320c in signal_thread_entry(JavaThread*, Thread*) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#5 0x00007f0b24f6aa9b in JavaThread::thread_main_inner() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#6 0x00007f0b24f6ada1 in JavaThread::run() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#8 0x00007f0b25cc8dd5 in start_thread () from /lib64/libpthread.so.0
#9 0x00007f0b255d5ead in clone () from /lib64/libc.so.6
Thread 21 (Thread 0x7f0b0f3ec700 (LWP 11121)):
#0 0x00007f0b25cccd12 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24dface7 in os::PlatformEvent::park(long) [clone .part.33] () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24dba614 in Monitor::IWait(Thread*, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#3 0x00007f0b24dbbace in Monitor::wait(bool, long, bool) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#5 0x00007f0b2497c01b in CompileBroker::compiler_thread_loop() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#6 0x00007f0b24f6aa9b in JavaThread::thread_main_inner() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#8 0x00007f0b24dfc952 in java_start(Thread*) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#9 0x00007f0b25cc8dd5 in start_thread () from /lib64/libpthread.so.0
#10 0x00007f0b255d5ead in clone () from /lib64/libc.so.6
Thread 20 (Thread 0x7f0b0f2eb700 (LWP 11122)):
#0 0x00007f0b25cccd12 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24dface7 in os::PlatformEvent::park(long) [clone .part.33] () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24dba614 in Monitor::IWait(Thread*, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#3 0x00007f0b24dbbace in Monitor::wait(bool, long, bool) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#4 0x00007f0b24973772 in CompileQueue::get() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#5 0x00007f0b2497c01b in CompileBroker::compiler_thread_loop() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#6 0x00007f0b24f6aa9b in JavaThread::thread_main_inner() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#7 0x00007f0b24f6ada1 in JavaThread::run() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#8 0x00007f0b24dfc952 in java_start(Thread*) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#9 0x00007f0b25cc8dd5 in start_thread () from /lib64/libpthread.so.0
#10 0x00007f0b255d5ead in clone () from /lib64/libc.so.6
Thread 19 (Thread 0x7f0b0f1ea700 (LWP 11123)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e053ab in os::PlatformEvent::park() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24dba529 in Monitor::IWait(Thread*, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#3 0x00007f0b24dbba8a in Monitor::wait(bool, long, bool) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#4 0x00007f0b24eac4d1 in ServiceThread::service_thread_entry(JavaThread*, Thread*) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#5 0x00007f0b24f6aa9b in JavaThread::thread_main_inner() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#7 0x00007f0b24dfc952 in java_start(Thread*) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#8 0x00007f0b25cc8dd5 in start_thread () from /lib64/libpthread.so.0
#9 0x00007f0b255d5ead in clone () from /lib64/libc.so.6
Thread 18 (Thread 0x7f0b0f0e9700 (LWP 11124)):
#0 0x00007f0b25cccd12 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24dface7 in os::PlatformEvent::park(long) [clone .part.33] () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24dba614 in Monitor::IWait(Thread*, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#3 0x00007f0b24dbba8a in Monitor::wait(bool, long, bool) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#4 0x00007f0b24f5e60a in WatcherThread::run() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#5 0x00007f0b24dfc952 in java_start(Thread*) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#6 0x00007f0b25cc8dd5 in start_thread () from /lib64/libpthread.so.0
#7 0x00007f0b255d5ead in clone () from /lib64/libc.so.6
Thread 17 (Thread 0x7f0b0efe8700 (LWP 11150)):
#0 0x00007f0b25cccd12 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e05aea in Parker::park(bool, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24f9347b in Unsafe_Park () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#6 0x00007f0b0efe7840 in ?? ()
#7 0x00007f0b255ebc6d in clock_gettime () from /lib64/libc.so.6
#8 0x00007f0b24dfd5cf in os::javaTimeNanos() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#22 0x00000000f6369810 in ?? ()
#23 0x00007f0b24dfd5cf in os::javaTimeNanos() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
Thread 16 (Thread 0x7f0b0dc32700 (LWP 11152)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e05ac0 in Parker::park(bool, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24f9347b in Unsafe_Park () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#6 0x00007f0b0dc31840 in ?? ()
#7 0x00007f0b255ebc6d in clock_gettime () from /lib64/libc.so.6
#8 0x00007f0b24dfd5cf in os::javaTimeNanos() () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#18 0x0000000000000000 in ?? ()
Thread 15 (Thread 0x7f0b0cf1f700 (LWP 11153)):
#0 0x00007f0b25cccd12 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24dface7 in os::PlatformEvent::park(long) [clone .part.33] () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24e02586 in os::sleep(Thread*, long, bool) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#3 0x00007f0b24bf366a in JVM_Sleep () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#16 0x0000000000000000 in ?? ()
Thread 14 (Thread 0x7f0b0cc1e700 (LWP 11156)):
#0 0x00007f0b255d6483 in epoll_wait () from /lib64/libc.so.6
#1 0x00007f0b0d927844 in Java_sun_nio_ch_EPollArrayWrapper_epollWait () from /user/java/jdk1.8.0_221/jre/lib/amd64/libnio.so
#6 0x0000000000000000 in ?? ()
Thread 13 (Thread 0x7f0b0cb1d700 (LWP 11157)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e05ac0 in Parker::park(bool, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24f9347b in Unsafe_Park () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#9 0x00000000f6493598 in ?? ()
#10 0x00007f0b254b6f8c in os::_initial_active_processor_count () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#14 0x0000000000000000 in ?? ()
Thread 12 (Thread 0x7f0b0ca1c700 (LWP 11158)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e05ac0 in Parker::park(bool, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24f9347b in Unsafe_Park () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#9 0x00000000f6493598 in ?? ()
#10 0x00007f0b254b6f8c in os::_initial_active_processor_count () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#14 0x0000000000000000 in ?? ()
Thread 11 (Thread 0x7f0b0c91b700 (LWP 11159)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e05ac0 in Parker::park(bool, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24f9347b in Unsafe_Park () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#8 0x00000000f643fbc8 in ?? ()
#9 0x00000000f6493598 in ?? ()
#10 0x00007f0b254b6f8c in os::_initial_active_processor_count () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#13 0x00007f0b110594e2 in ?? ()
#14 0x0000000000000000 in ?? ()
Thread 10 (Thread 0x7f0b0c81a700 (LWP 11160)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e05ac0 in Parker::park(bool, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24f9347b in Unsafe_Park () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#8 0x00000000f643fbc8 in ?? ()
#9 0x00000000f6493598 in ?? ()
#10 0x00007f0b254b6f8c in os::_initial_active_processor_count () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#13 0x00007f0b110594e2 in ?? ()
#14 0x0000000000000000 in ?? ()
Thread 9 (Thread 0x7f0b0c719700 (LWP 11161)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e05ac0 in Parker::park(bool, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24f9347b in Unsafe_Park () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#8 0x00000000f643fbc8 in ?? ()
#9 0x00000000f6493598 in ?? ()
#10 0x00007f0b254b6f8c in os::_initial_active_processor_count () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#14 0x0000000000000000 in ?? ()
Thread 8 (Thread 0x7f0b0c618700 (LWP 11162)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e05ac0 in Parker::park(bool, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24f9347b in Unsafe_Park () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#8 0x00000000f643fbc8 in ?? ()
#9 0x00000000f6493598 in ?? ()
#10 0x00007f0b254b6f8c in os::_initial_active_processor_count () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#13 0x00007f0b110594e2 in ?? ()
#14 0x0000000000000000 in ?? ()
Thread 7 (Thread 0x7f0b0c517700 (LWP 11163)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e05ac0 in Parker::park(bool, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24f9347b in Unsafe_Park () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#3 0x00007f0b10db83ea in ?? ()
#4 0x00000000f5b9c730 in ?? ()
#5 0x00007f0b24fc6ff0 in VMThread::execute(VM_Operation*) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#11 0x0000000000000000 in ?? ()
Thread 6 (Thread 0x7f0b0c416700 (LWP 11164)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e05ac0 in Parker::park(bool, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24f9347b in Unsafe_Park () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#8 0x00000000f643fbc8 in ?? ()
#9 0x00000000f6493598 in ?? ()
#10 0x00007f0b254b6f8c in os::_initial_active_processor_count () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#14 0x0000000000000000 in ?? ()
Thread 5 (Thread 0x7f0b0c315700 (LWP 11165)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e05ac0 in Parker::park(bool, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24f9347b in Unsafe_Park () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#9 0x00000000f6493598 in ?? ()
#10 0x00007f0b254b6f8c in os::_initial_active_processor_count () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#14 0x0000000000000000 in ?? ()
Thread 4 (Thread 0x7f0b0c214700 (LWP 11166)):
#0 0x00007f0b25ccc965 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f0b24e05ac0 in Parker::park(bool, long) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#2 0x00007f0b24f9347b in Unsafe_Park () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#9 0x00000000f6493598 in ?? ()
#10 0x00007f0b254b6f8c in os::_initial_active_processor_count () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#14 0x0000000000000000 in ?? ()
Thread 3 (Thread 0x7f0b0c113700 (LWP 11167)):
#0 0x00007f0b255d6483 in epoll_wait () from /lib64/libc.so.6
#1 0x00007f0b0d927844 in Java_sun_nio_ch_EPollArrayWrapper_epollWait () from /user/java/jdk1.8.0_221/jre/lib/amd64/libnio.so
#3 0x00000000f643f968 in ?? ()
#4 0x00007f0b2494bf2c in CollectedHeap::new_store_pre_barrier(JavaThread*, oopDesc*) () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#17 0x0000000000000000 in ?? ()
Thread 2 (Thread 0x7f0af9ad5700 (LWP 11168)):
#0 0x00007f0b25ccf97d in accept () from /lib64/libpthread.so.0
#1 0x00007f0b0d92b1d3 in Java_sun_nio_ch_ServerSocketChannelImpl_accept0 () from /user/java/jdk1.8.0_221/jre/lib/amd64/libnio.so
#9 0x00000000f643dcc8 in ?? ()
#10 0x00007f0b24be85a4 in JVM_IsInterrupted () from /user/java/jdk1.8.0_221/jre/lib/amd64/server/libjvm.so
#13 0x0000000000000000 in ?? ()
Thread 1 (Thread 0x7f0b260f2740 (LWP 11115)):
#0 0x00007f0b25cc9f47 in pthread_join () from /lib64/libpthread.so.0
#1 0x00007f0b25ab6855 in ContinueInNewThread0 () from /user/java/jdk1.8.0_221/bin/../lib/amd64/jli/libjli.so
#2 0x00007f0b25ab2c42 in ContinueInNewThread () from /user/java/jdk1.8.0_221/bin/../lib/amd64/jli/libjli.so
#3 0x00007f0b25ab3368 in JLI_Launch () from /user/java/jdk1.8.0_221/bin/../lib/amd64/jli/libjli.so
#4 0x000000000040053a in main ()
看到上面打印出的LWP了吗,这里是个知识点, LPW是指Light-weight process
轻量级线程。引申知识:
- Linux中没有真正的线程
- Linux中没有的线程
Thread
是由进程来模拟实现的所以称作:轻量级进程 - 进程是「资源管理」的最小单元,线程是「资源调度」的最小单元(这里不考虑协程)
strace
跟踪进程内部的系统调用和信号,什么是「系统调用」?系统调用(system call),指运行在「用户态」的程序向操作系统「内核态」请求需要更高权限运行的服务,系统调用提供用户程序与操作系统之间的接口。一般涉及的硬件操作的都会由用户态转向内核态,如读写磁盘。strace
后面跟着启动一个进程,可以跟踪启动后进程的系统调用和信号,这个命令可以看到进程执行时候都调用了哪些系统调用,通过指定不同的选项可以输出系统调用发生的时间,精度可以精确到微秒,甚至还可以统计分析系统「调用的耗时」。这在排查进程假死问题的时候很有用,能帮你发现进程卡在哪个系统调用上。已经在运行的进程也可以指定-p
参数加pid,查看进程信息
strace -o output.txt -T -tt -e trace=all -p 28979
27207 mkdir("/tmp/.ICE-unix", 0777) = -1 EEXIST (File exists)
27207 lstat64("/tmp/.ICE-unix", {st_mode=S_IFDIR|S_ISVTX|0755, st_size=4096, ...}) = 0
27207 unlink("/tmp/.ICE-unix/dcop27207-1066844596") = -1 ENOENT (No such file or directory)
27207 bind(3, {sin_family=AF_UNIX, path="/tmp/.ICE-unix/dcop27207-1066844596"}, 38) = -1 EACCES (Permission denied)
27207 write(2, "_KDE_IceTrans", 13) = 13
27207 write(2, "SocketCreateListener: failed to "..., 46) = 46
27207 close(3) = 0 27207 write(2, "_KDE_IceTrans", 13) = 13
27207 write(2, "SocketUNIXCreateListener: ...Soc"..., 59) = 59
27207 umask(0) = 0 27207 write(2, "_KDE_IceTrans", 13) = 13
27207 write(2, "MakeAllCOTSServerListeners: fail"..., 64) = 64
27207 write(2, "Cannot establish any listening s"..., 39) = 39
每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。其中第一行显示程序试图创建/tmp/.ICE-unix目录,权限为0777,这个操作因为目录已经存在而失败了。第二个系统调用(lstat64)检查 了目录状态,并显示这个目录的权限是0755,这里出现了第一个程序运行错误的线索:程序试图创建属性为0777的目录,但是已经存在了一个属性为 0755的目录。第三个系统调用(unlink)试图删除一个文件,但是这个文件并不存在。strace的常用参数如下
-tt :在每行输出的前面,显示毫秒级别的时间
-T :显示每次系统调用所花费的时间
-v :对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
-f :跟踪目标进程,以及目标进程创建的所有子进程
-e :控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
-o :把strace的输出单独写到指定的文件
-s :当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节
-p :指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。
proc目录
/proc目录下有很多以数字命名的目录,每个数字代表进程号PID它们是进程目录。/proc
系统是一个伪文件系统,它只存在内存当中,而不占用外存空间,以文件系统的方式为内核与进程提供通信的接口。进入系统/proc
目录:
系统中当前运行的每一个进程在/proc下都对应一个以进程号为目录名的目录/proc/pid
。通过/proc/pid
文件了解进程的运行时信息和统计信息。它们是读取进程信息的接口,我们可以进到这个文件里面,了解进程的运行时信息和统计信息。/proc/pid
目录下的有一些重要文件,挑几个使用频率高的讲一讲。
高频使用
/proc/pid/environ
:包含了进程的可用环境变量的列表 。程序出问题了如果不确定环境变量是否设置生效,可以cat
这个文件出来查看确认一下。
/proc/pid/fd/
:这个目录包含了进程打开的每一个文件的链接。从这里可以查看进程打开的文件描述符信息,包括标准输入、输出、错误流,进程打开的socket
连接文件描述符也能看到,lsof
命令也有类似的作用。
/proc/pid/stat
:包含了进程的所有状态信息,进程号、父进程号、 线程组号、 该任务在用户态运行的时间 、 该任务在用内核态运行的时间、 虚拟地址空间的代码段、 阻塞信号的位图等等信息应有尽有。
/proc/pid/cmdline
:该文件保存了进程的完整命令行
/proc/pid/cwd
:一个符号连接, 指向进程当前的工作目录
/proc/pid/exe
: 包含了正在进程中运行的程序链接
/proc/pid/mem
: 包含了进程在内存中的内容
/proc/pid/statm
: 包含了进程的内存使用信息
vi编辑文件
vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器。他是我们使用Linux系统不能缺少的工具。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,通常我们在部署时,常需要修改服务配置文件中的一些配置,这时就需要使用vi编辑文件了。vi可以分为三种模式,我把它叫做读模式
,写模式
,命令模式
。网上的叫法挺多,例如一般模式,编辑模式或是输入模式,末行模式。没有一个统一的叫法。
读模式
:通过vi命令刚进入文件的状态,这时内容是只读的不能修改写模式
:进入到读模式后通过按键【I】,进入写模式,这时可以编辑文件内容命令模式
:在读模式下通过 组合按键【Shift+:】,进入到命令模式。
vi text.yml 进入读模式
通过vi+空格+文件名,来进入到文件编辑,这时文本末尾会出现 insert 单词,表明当前是在写模式下
然后我们就可以通过 上下左右 方向键来控制光标,修改文本了。
【Esc】 退出写模式,回到读模式
文件编辑好后,通过esc键回到读模式,表示我们刚刚的文件已经修改完成了,这时我们需要进入命令模式,通过命令来保存我们刚刚修改的文件
【Shift+:】命令模式
在命令模式中,我们可以强制退出,保存退出,或者将修改的文件另存为一个新的文件。一般的会使用 :wq
命令,然后按回车键,表示保存退出
下面来看一下有哪些命令
:w
保存编辑的内容:w!
强制写入该文件,但跟你对该文件的权限有关:q
离开vi:q!
不想保存修改强制离开:wq
保存后退出,这个命令最常用:x
保存后离开:zz
若文件没有更动,则不保存离开,若文件已经被更改过,则保存后离开:w filename
将编辑的数据保存成另一个文件(类似另存):r filename
在编辑的数据中,读入另一个文件的数据。即将【filename】 这个文件的内容加到光标所在行后面。:n1,n2 w filename
将n1到n2的内容保存成filename这个文件。n1和n2是文件内容的行号
操作系统信息
top
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最敏感的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。前五行是当前系统情况整体的统计信息区。
[root@VM_0_3_centos 11116]# top
top - 08:17:12 up 199 days, 13:12, 1 user, load average: 0.44, 0.14, 0.08
Tasks: 79 total, 1 running, 78 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.0 us, 2.7 sy, 0.0 ni, 94.0 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1015024 total, 114888 free, 441148 used, 458988 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 403244 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
23983 root 20 0 611272 13824 1672 S 2.7 1.4 1084:39 barad_agent
1282 root 20 0 129536 56032 55700 S 0.7 5.5 70:47.87 systemd-journal
9816 root 20 0 178236 48224 2916 S 0.7 4.8 125:08.10 YDService
2983 root 20 0 871408 201300 32616 S 0.3 19.8 44:22.61 rsyslogd
1 root 20 0 43504 2652 1384 S 0.0 0.3 26:13.90 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:01.27 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 7:28.86 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 19:44.31 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 1:22.41 watchdog/0
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
15 root 20 0 0 0 0 S 0.0 0.0 0:03.25 khungtaskd
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
17 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md
23 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 edac-poller
24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 watchdogd
30 root 20 0 0 0 0 S 0.0 0.0 1:34.06 kswapd0
31 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd
32 root 39 19 0 0 0 S 0.0 0.0 0:24.61 khugepaged
33 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 crypto
41 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kthrotld
第一行:任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下
08:17:12
:当前系统时间up 199 days, 13:12
:系统已经运行了199天13小时12分钟(在这期间系统没有重启过的哦!)1 user
:当前有1个用户登录系统load average: 0.44, 0.14, 0.08
:后面的三个数字分别是1分钟、5分钟、15分钟的负载情况。load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第二行:Tasks — 任务(进程)信息
79 total
:系统现在共有206个进程1 running
:处于运行中的有1个78 sleeping
:78个在休眠(sleep)0 stopped
:stoped状态的有0个0 zombie
:zombie状态(僵尸)的有0个。
第三行:%Cpu(s) – cpu状态信息。注意:在这里CPU的使用比率和windows概念不同,需要理解linux系统用户空间和内核空间的相关知识!
3.0 us
:用户空间占用CPU的百分比2.7 sy
:内核空间占用CPU的百分比0.0 ni
:改变过优先级的进程占用CPU的百分比94.0 id
:空闲CPU百分比0.3 wa
:IO等待占用CPU的百分比0.0 hi
:硬中断(Hardware IRQ)占用CPU的百分比0.0 si
:软中断(Software Interrupts)占用CPU的百分比0.0 st
:这个虚拟机被hypervisor偷去的CPU时间(注:如果当前OS是处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的)。
第四行:KiB Mem – 内存状态
1015024 total
:物理内存总量(1GB)114888 free
:使用中的内存总量(114MB)441148 used
:空闲内存总量(441MB)458988 buff/cache
:缓存的内存量 (458MB)
第五行:swap交换分区信息
- 0 total:交换区总量(0K)
- 0 free:空闲交换区总量(0K)
- 0 used:使用的交换区总量(0K)
- 403244 avail Mem:可用的交换区总量(403MB)
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。如果出于习惯去计算可用内存数,这里有个近似的可用内存计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:114888KB +458988KB +403244KB = 972MB左右。
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
第七行:各进程(任务)的状态监控,项目列信息说明如下
PID
:进程idUSER
:进程所有者,注意进程所有者同意也是进程拥有的权限,假如一个进程是 test 用户拥有,test用户没有某个目录的文件访问权限,那么当进程访问这个目录文件时,同样会有权限问题。PR
:进程优先级NI
:nice值。负值表示高优先级,正值表示低优先级VIRT
:进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RESRES
:进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATASHR
:共享内存大小,单位kbS
:进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程%CPU
:上次更新到现在的CPU时间占用百分比%MEM
:进程使用的物理内存百分比TIME+
:进程使用的CPU时间总计,单位1/100秒COMMAND
:进程名称(命令名/命令行)
vmstat
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。
[root@VM_0_3_centos 11116]# vmstat 2 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 0 77316 41716 455136 0 0 11 27 1 0 1 1 98 0 0
0 0 0 75044 41716 455160 0 0 8 2 312 598 1 1 98 1 0
0 0 0 75668 41728 455156 0 0 10 40 490 927 1 2 97 1 0
一般 vmstat
工具的使用是通过两个数字参数来完成的 第一个参数是采样的时间间隔数,单位是秒 第二个参数是采样的次数
procs:进程信息
r
:运行和等待 CPU 时间片的进程数,原则上1核的 CPU 的运行队列不要超过2,整个系统的运行队列不能超过总核数的2倍,否则代表系统压力过大b
:等待资源的进程数或阻塞的进程,比如正在等待磁盘I/O、网络I/O等
memory:内存信息
swpd
:虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。free
:空闲的物理内存的大小buff
:Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用40多Mcache
:直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用455多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地还给程序使用。)
swap:虚拟内存信息
si
:每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。so
:每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
io:系统IO信息
bi
:块设备每秒接收的块数量即读块设备,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024bytebo
:块设备每秒发送的块数量即写块设备,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
system:系统信息
in
:每秒CPU的中断次数,包括时间中断cs
:每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
cpu:CPU信息
us
:用户CPU时间,曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)sy
:空系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。id
:空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。wa
:等待IO时间,wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈
free 内存信息
应用程序可用内存数 free -g
内存大小按照 GB 统计 free -m
内存大小按照 MB 统计。free -h
命令比较直观,统计出来的数字后面自带单位
[root@VM_0_3_centos 11116]# free -h
total used free shared buff/cache available
Mem: 991M 431M 60M 496K 499M 388M
Swap: 0B 0B 0B
df 磁盘信息
df -h
查看磁盘剩余空间
[root@VM_0_3_centos 11116]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 50G 7.2G 40G 16% /
devtmpfs 486M 0 486M 0% /dev
tmpfs 496M 24K 496M 1% /dev/shm
tmpfs 496M 472K 496M 1% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
tmpfs 100M 0 100M 0% /run/user/0
iostat 系统IO信息
[user1@Test_Server ~]$ iostat -x
Linux 3.10.0-693.2.2.el7.x86_64 (jellythink) 01/05/2019 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
1.83 0.00 0.31 0.09 0.00 97.77
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.03 0.78 0.24 1.38 12.64 20.67 41.01 0.02 10.98 55.50 3.17 0.71 0.12
iostat -x
也可以看到系统的CPU信息,iostat
命令的重点不是用来看CPU的,重点是用来监测磁盘性能的。
Device
:设备名称rrqm/s
:每秒合并到设备的读取请求数wrqm/s
:每秒合并到设备的写请求数r/s
:每秒向磁盘发起的读操作数w/s
:每秒向磁盘发起的写操作数rkB/s
:每秒读K字节数wkB/s
:每秒写K字节数avgrq-sz
:平均每次设备I/O操作的数据大小avgqu-sz
:平均I/O队列长度await
:平均每次设备I/O操作的等待时间 (毫秒),一般地,系统I/O响应时间应该低于5ms,如果大于 10ms就比较大了r_await
:每个读操作平均所需的时间;不仅包括硬盘设备读操作的时间,还包括了在kernel队列中等待的时间w_await
:每个写操作平均所需的时间;不仅包括硬盘设备写操作的时间,还包括了在kernel队列中等待的时间svctm
:平均每次设备I/O操作的服务时间 (毫秒)(这个数据不可信!)%util
:一秒中有百分之多少的时间用于I/O操作,即被IO消耗的CPU百分比,一般地,如果该参数是100%表示设备已经接近满负荷运行了
ifstat 网络IO
[root@VM_0_3_centos 11116]# ifstat
#kernel
Interface RX Pkts/Rate TX Pkts/Rate RX Data/Rate TX Data/Rate
RX Errs/Drop TX Errs/Drop RX Over/Rate TX Coll/Rate
lo 14 0 14 0 1168 0 1168 0
0 0 0 0 0 0 0 0
eth0 100481K 0 102661K 0 1059M 0 1923M 0
0 0 0 0 0 0 0 0
lo
和eth0
分别表示的是网卡名称