Linux 시스템은 CPU, 메모리, 네트워크 카드, 저장 장치 등 여러 주요 물리적 구성 요소로 구성됩니다. Linux 환경을 효과적으로 관리하려면 각 구성 요소가 처리하는 리소스 수, 병목 현상이 있는지 여부 등 이러한 리소스에 대한 다양한 지표를 합리적인 정확도로 측정할 수 있어야 합니다. 아래에서는 Linux 리소스 모니터링과 관련된 몇 가지 명령어를 소개합니다.
시스템 릴리스 보기
root@cf0c6032ba2f:/# lsb_release -a
사용 가능한 LSB 모듈이 없습니다.
배포자 ID: Ubuntu
설명: Ubuntu 14.04.5 LTS
릴리스: 14.04
코드명: trusty
top(cpu)
Cpu(s) 라인 정보 제공 현재 CPU 작동:
Cpu: 11.4%us, 29.6%sy, 0.0%ni, 58.3%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0% st
us: 우아하지 않은 사용자 프로세스를 실행하는 데 소요된 사용자 CPU 시간의 비율입니다(elegant는 영어로 "nicing"으로, 다른 프로세스에 따라 우선순위를 변경할 수 있는 프로세스를 의미함).
sy: 시스템 CPU 시간 커널 및 커널 프로세스를 실행하는 데 소요된 CPU 시간의 비율입니다.
ni: 우아한 CPU 시간 일부 프로세스의 우선순위를 변경한 경우 이 측정항목을 통해 해당 프로세스가 차지하는 CPU 시간의 비율을 알 수 있습니다.
id: CPU 유휴 시간 이는 매우 높은 수치를 원하는 측정항목 중 하나입니다. CPU의 유휴 시간 비율을 나타냅니다. 시스템이 느리게 실행되지만 이 지표가 특히 높은 경우 문제의 원인이 높은 CPU 로드가 아니라는 것을 확신할 수 있습니다.
wa: I/O 대기 이 숫자는 I/O 작업을 수행하기 위해 대기하는 데 소요된 CPU 시간의 비율을 나타냅니다. 이는 느린 시스템 문제를 해결할 때 매우 중요한 지표입니다. 속도가 낮으면 디스크 또는 네트워크 I/O 문제를 쉽게 배제할 수 있기 때문입니다.
hi: 하드웨어 인터럽트. CPU가 하드웨어 인터럽트를 처리하는 데 소요되는 시간의 비율입니다.
si: 소프트웨어 인터럽트. CPU가 소프트웨어 인터럽트를 처리하는 데 소비하는 시간의 비율입니다.
st: 경과 시간 가상 머신을 실행 중인 경우 이 측정항목은 가상 머신에서 수행되는 다른 작업이 차지하는 CPU 시간의 비율을 알려줍니다.
CPU 수 확인
리눅스 서버의 CPU 상태를 판단하는 기준은 다음과 같습니다.
같은 코어 ID를 가진 CPU는 같은 코어의 하이퍼스레드입니다. .
동일한 물리적 ID를 가진 CPU는 동일한 CPU로 캡슐화된 스레드 또는 코어입니다.
물리적 CPU 수를 표시하는 명령은 다음과 같습니다.
cat /proc/cpuinfo | grep "physical id" | wc -l
각 물리적 CPU의 코어 수(즉, 코어 수)를 표시하는 명령은 다음과 같습니다.
cat /proc/cpuinfo | grep "cpu cores" | uniq
명령 결과는 다음과 같습니다. cpu cores : 1
표시 논리 CPU 수에 대한 명령은 다음과 같습니다.
cat /proc/cpuinfo | grep "processor" | wc -l
명령 결과는 다음과 같습니다. 4 실제로 여기에서 볼 수 있듯이 CPU 수에 대한 이유는 다음과 같습니다. 다음 방정식: 물리적 CPU 수 × 코어 수 = 논리적 CPU 수가 같지 않으면 서버 CPU가 하이퍼스레딩 기술을 지원한다는 의미입니다. 서버 애플리케이션을 구성할 때는 서버의 논리적 CPU 수를 기준으로 삼아야 합니다.
uptime(평균 부하)
때때로 시스템 응답 속도가 매우 느리다고 느낄 때가 있지만, 이유를 찾을 수 없는 경우에는 평균 부하를 확인해야 합니다. 대기열에 대기 중인 프로세스 수가 많은지 확인하세요. 특정 시간 간격 내에 실행 중인 대기열에 있는 평균 프로세스 수는 시스템의 사용량을 반영할 수 있으므로 일반적으로 웹 사이트나 시스템 속도가 느려지는 즉시 시스템 부하, 즉 CPU의 평균 부하를 확인합니다. . 로드 평균을 확인하는 방법 가장 간단한 명령은 아래와 같이 uptime입니다.
uptime
명령은 다음과 같이 결과를 표시합니다.
11:31:11 up 11 days, 19:01, 2 users, load average: 0.02, 0.01, 0.00
현재 대부분의 주류 서버는 듀얼 쿼드 코어이며 상당히 강력한 CPU를 갖추고 있어 일반적인 응용 서비스를 제공할 때 Linux 시스템의 부하에 대해 걱정할 필요가 없습니다.
여기서 주목해야 할 것은 로드 평균의 출력 값입니다. 일반적으로 이 세 가지 값의 크기는 시스템의 논리적 CPU 수보다 클 수 없습니다. 출력에서 시스템에는 4개의 논리 CPU가 있습니다. 로드 평균의 세 값이 오랫동안 4보다 큰 경우 CPU가 매우 사용량이 많고 로드가 매우 높음을 의미하며 이는 시스템에 영향을 미칠 수 있습니다. 그러나 가끔 4보다 큰 경우에는 일반적으로 시스템 성능에 영향을 미치지 않으므로 걱정하지 마십시오. 반대로, 부하 평균의 출력 값이 CPU 수보다 작다면 이는 CPU가 여전히 유휴 상태임을 의미합니다. 예를 들어 이 예의 출력은 CPU가 상대적으로 유휴 상태임을 보여줍니다.
이때 vmstat 명령을 사용하여 시스템이 너무 바쁜지 확인할 수 있습니다. 너무 바쁜 것으로 판단되면 서버를 교체할지 아니면 CPU 수를 늘릴지 고려해야 합니다. 요약하면 다음과 같습니다. r이 3 또는 4보다 큰 경우가 많고, id가 50보다 작은 경우가 많으면 CPU에 부하가 많이 걸리는 것을 의미합니다.
top(mem)
Mem: 1024176k total, 997408k used, 26768k free, 85520k buffers Swap: 1004052k total, 4360k used, 999692k free, 286040k cached
첫 번째 줄은 사용 가능한 물리적 메모리의 양, 사용된 메모리의 양, 사용 가능한 메모리의 양, 캐시된 양을 알려줍니다. 2행에서는 유사한 정보, 스왑 스토리지 및 Linux 파일 캐시에서 사용되는 RAM의 양을 제공합니다.
프로세스가 실제로 얼마나 많은 RAM을 사용하고 있는지 확인하려면 RAM의 파일 캐시를 지워야 합니다. 샘플 코드에서 볼 수 있듯이 사용된 RAM 997408KB 중 파일 캐시가 차지하는 RAM은 286040KB이므로 실제로 사용되는 RAM은 711368KB에 불과합니다. RAM이 부족한지 확인하는 좋은 방법은 파일 캐시를 살펴보는 것입니다.
如果实际用的内存减去文件缓存的值很大,同时交换存储的值也很高,很可能的确有内存问题。
free -m(内存)
显示的是当前内存的使用情况,m的意思是以M个字节来显示内容,此命令只在Linux系统下有效,在FreeBSD下是没有此命令的。命令显示结果如下所示:
total used free sharedbuffers cached Mem: 3949 1397 2551 0268917 -/+ buffers/cache:211 3737 Swap:8001 0 8001
上述结果中各个参数的详细说明如下:
total:内存总数。
used:已经使用的内存数。
free:空闲的内存数。
shared:多个进程共享的内存总额。
buffers buffer cache和cached page cache:磁盘缓存的大小。
-buffers/cache:(已用)的内存数,即used-buffers-cached。
+buffers/cache:(可用)的内存数,即free + buffers + cached。 由此得出结论,可用内存的计算公式为可用内存=free+buffers+cached 即 2551MB+268MB+917MB=3737MB 注意 上面等式两边的数值并不相等,但这个没关系,-m参数其实是以整数数值来取舍的。大家如果对这个运算结果有怀疑,可以尝试不带-m参数来观看free命令显示的结果,这样就会一目了然了。
可见-buffers/cache反映的是被程序实实在在占用的内存,而+buffers/cache反映的是可以挪用的内存总数。
vmstat(io)
vmstat是一个相当全面的性能分析工具,通过它可以观察系统的进程状态、内存使用情况、虚拟内存的使用情况、磁盘的I/O、中断、上下文切换、CPU的使用情况等性能信息,建议熟练掌握此命令。
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si sobibo incs us sy id wa
2 0 0 519024 74732 460656800 3 9510 27 5 68 0 2 0 0 519664 74732 460656800 0 0 1847 1244 20 17 63 0 1 0 0 517296 74732 460656800 0 284 2092 1617 37 17 47 0 3 0 0 515440 74732 460656800 0 164 1620 718 26 17 57 0
其中:
(1)procs r:等待运行的进程数。 b:处于非中断睡眠状态的进程数。
(2)memory swpd:虚拟内存使用情况(单位:KB)。 free:空闲的内存(单位:KB)。 buff:被用来作为缓存的内存数量(单位:KB)。
(3)swap si:从磁盘交换到内存的交换页数量(单位:KB/s)。 so:从内存交换到磁盘的交换页数量(单位:KB/s)。
(4)io bi:发送到块设备的块数(单位:块/秒)。 bo:从块设备接收到的块数(单位:块/秒)。
(5)system in:每秒的中断数,包括时钟中断。 cs:每秒的环境(上下文)切换次数。 (6)cpu 按CPU的总使用百分比来显示。 us:CPU使用时间。 sy:CPU系统使用时间。 id:闲置时间。
标准情况下r和b值应该为:r<5,b≈0。 如果user%+sys%<70%则表示系统性能较好,如果user%+sys%>=85%或以上,这表示系统性能比较糟糕,这时就要对系统进行全方面检查了。其中: user%表示CPU处在用户模式下的时间百分比。 sys%表示CPU处在系统模式下的时间百分比。
ps auxf(进程)
要查看系统中用户正在运行的所有进程,可以在ps命令后面使用以下选项:
a(表示所有用户)
u(以面向用户的格式显示,或显示拥有每个进程的用户)
x(没有控制tty或终端屏幕的进程,“显示每个进程”的另一种方法)
ps aux
请注意"ps -aux"不同于"ps aux"。POSIX和UNIX的标准要求"ps -aux"打印用户名为"x"的用户的所有进程,以及打印所有将由-a选项选择的过程。如果用户名为"x"不存在,ps的将会解释为"ps aux",而且会打印一个警告。这种行为是为了帮助转换旧脚本和习惯。它是脆弱的,即将更改,因此不应依赖。
要查看进程树,除了使用上一节用过的a、u和x选项,还要加上个f(其名称源于ASCII art forest)选项。
ps auxf
ps -ef(进程)
ps aux是用BSD格式来显示结果.ps -ef是用全格式的System V格式,显示出来就是带全路径的进程名.
一个影响使用的区别是aux会截断command列,而-ef不会。因此当需要结合grep的时候,优先选择-ef命令,避免误判
netstat(网络)
netstat命令的功能是显示网络连接、路由表和网络接口的信息,可以让用户得知目前都有哪些网络连接正在运作。 下面是它的重要参数,以及详细的说明:
-A:显示任何关联的协议控制块的地址。主要用于调试。
-a:显示所有套接字的状态。在一般情况下不显示与服务器进程相关联的套接字。
-i:显示自动配置接口的状态。那些在系统初始引导后配置的接口状态不在输出之列。
-m:打印网络存储器的使用情况。
-n:打印实际地址,而不是对地址的解释或显示主机、网络名之类的符号。
-r:打印路由选择表。
-f address:family会对于给出名字的地址簇打印统计数字和控制块信息。到目前为止,它唯一支持的地址簇是inet。
-I interface:表示只打印给出名字的接口状态。
-p protocol-name:表示只打印给出名字的协议的统计数字和协议控制块信息。
-s:打印每个协议的统计数字。
-t:表示在输出显示中用时间信息代替队列长度信息。
我们用得最多的,也是最习惯的参数有两个,即netstat-an,如下所示:
netstat -an | grep –v unix
lsof(文件)
lsof(list open files)是一个列出当前系统打开文件的工具。在UNIX环境下,任何事物都是以文件的形式存在的,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以像传输控制协议(TCP)和用户数据报协议(UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符都会为应用程序与基础操作系统之间的交互提供通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序的信息,因此通过lsof工具查看这个列表对系统监测,以及排错非常有帮助。顺便提一下,这工具首先出现在UNIX系统中,后才移植到Linux平台下。
工作中用得最多的是-i参数,可以用它来查看特定端口的情况,比如,我可以用lsof -i:22查看22端口是由哪些程序占用的。
fdisk -l(硬盘分区)
查看硬盘及分区信息,如下所示: fdisk –l 命令显示结果如下:
Disk /dev/sda: 160.0 GB, 160040803840 bytes 255 heads, 63 sectors/track, 19457 cylinders Units = cylinders of 16065 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 1 13 104391 83 Linux / /dev/sda2 14320025599577+ 83 Linux /dev/sda332013582 3068415 82 Linux swap / Solaris /dev/sda43583 19457 127515937+ 5 Extended /dev/sda53583 19457 127515906 83 Linux
以上结果表明这是一块160GB的服务器硬盘。
df(硬盘空间)
检查文件系统的磁盘空间占用情况,命令如下所示:
df –h 命令显示结果如下:
FilesystemSize Used Avail Use% Mounted on /dev/sda2 24G 5.9G 17G 26% /
/dev/sda5 118G 8.8G 103G 8% /data
/dev/sda1 99M 20M 75M 21% /boot
tmpfs 859M 0 859M 0% /dev/shm
du(目录大小)
查看Linux系统中某目录的大小,这在工作中经常会遇到。可以使用如下命令查看:
du -sh 目录名
例如du -sh /data 命令显示结果如下所示: 8.6G /data/ 检查是否有分区使用率(Use%)过高(比如超过90%),如发现某个分区空间接近用完,可以进入该分区的挂载点,用以下命令找出占用空间最多的文件或目录,然后按照从大到小的顺序,正好可以找出系统中占用最多空间的前十个文件或目录:
du -sh * | sort -hr | head -n 10
doc