项目作者: DAN-AND-DNA

项目描述 :
learn linux tools 好用的linux工具教程
高级语言:
项目地址: git://github.com/DAN-AND-DNA/learn-linux-tools-by-example.git
创建时间: 2019-05-10T09:33:06Z
项目社区:https://github.com/DAN-AND-DNA/learn-linux-tools-by-example

开源协议:

关键词:
linux tools

下载


Linux 好用的工具教程

介绍一些好用的linux工具,教程所用的例程: https://github.com/DAN-AND-DNA/37net

内容

进程

strace

利用该工具可以追踪进程的系统调用,例如:

  1. -T 显示调用花费时间
  2. -ttt 显示时间戳
  3. -p 追踪目标进程
  4. $ strace -T -ttt -p 4863
  5. strace: Process 4863 attached
  6. 1557980690.094349 epoll_wait(4, [{EPOLLIN, {u32=3, u64=3}}], 10000, 10000) = 1 <2.926908>
  7. 1557980693.021310 accept4(3, {sa_family=AF_INET, sin_port=htons(55858), sin_addr=inet_addr("192.168.0.45")}, [16], SOCK_CLOEXEC|SOCK_NONBLOCK) = 6 <0.000012>
  8. 1557980693.021360 write(1, "1557980693 client online :192.16"..., 39) = 39 <0.000011>
  9. 1557980693.021389 epoll_ctl(4, EPOLL_CTL_ADD, 6, {EPOLLIN, {u32=6, u64=5630027437233405958}}) = 0 <0.000008>
  10. 1557980693.021413 epoll_wait(4, [{EPOLLIN, {u32=6, u64=5630027437233405958}}], 10000, 10000) = 1 <0.000008>
  11. 1557980693.021435 read(6, "a", 1) = 1 <0.000009>
  12. 1557980693.021459 epoll_wait(4, [{EPOLLIN, {u32=6, u64=5630027437233405958}}], 10000, 10000) = 1 <1.006827>
  13. 1557980694.028329 read(6, "a", 1) = 1 <0.000016>
  14. 1557980694.028364 epoll_wait(4, [{EPOLLIN, {u32=6, u64=5630027437233405958}}], 10000, 10000) = 1 <1.061431>
  15. 1557980695.089865 read(6, "a", 1) = 1 <0.000027>
  16. 1557980695.089955 epoll_wait(4, [{EPOLLIN, {u32=6, u64=5630027437233405958}}], 10000, 10000) = 1 <1.000368>
  17. 1557980696.090368 read(6, "a", 1) = 1 <0.000010>
  18. 1557980696.090399 epoll_wait(4, [{EPOLLIN, {u32=6, u64=5630027437233405958}}], 10000, 10000) = 1 <1.000272>
  19. 1557980697.090721 read(6, "a", 1) = 1 <0.000009>
  20. 1557980697.090744 epoll_wait(4, [{EPOLLIN, {u32=6, u64=5630027437233405958}}], 10000, 10000) = 1 <0.738838>
  21. 1557980697.829642 read(6, "", 1) = 0 <0.000008>
  22. 1557980697.829695 write(1, "1557980697 client offline\n", 26) = 26 <0.000012>
  23. 1557980697.829731 epoll_ctl(4, EPOLL_CTL_DEL, 6, 0x7fff4e21e0b0) = 0 <0.000008>
  24. 1557980697.829771 close(6) = 0 <0.000044>
  25. 1557980697.829829 epoll_wait(4, [], 10000, 10000) = 0 <10.011406>
  26. 1557980707.841269 epoll_wait(4,

查看总体的统计,需要目标进程结束:

  1. strace -c -p 4863
  2. strace: Process 4863 attached
  3. % time seconds usecs/call calls errors syscall
  4. ------ ----------- ----------- --------- --------- ----------------
  5. 50.57 0.000442 29 15 1 epoll_wait
  6. 27.23 0.000238 18 13 read
  7. 16.13 0.000141 71 2 close
  8. 3.66 0.000032 8 4 write
  9. 1.14 0.000010 5 2 epoll_ctl
  10. 0.69 0.000006 6 1 accept4
  11. 0.46 0.000004 4 1 munmap
  12. 0.11 0.000001 1 1 1 rt_sigreturn
  13. ------ ----------- ----------- --------- --------- ----------------
  14. 100.00 0.000874 39 2 total

其他详细参数请参考man strace

valgrind

利用valgrind进行函数调用剖析,例如:

  1. $ valgrind --tool=callgrind ./echo
  2. ==4137== Callgrind, a call-graph generating cache profiler
  3. ==4137== Copyright (C) 2002-2017, and GNU GPL'd, by Josef Weidendorfer et al.
  4. ==4137== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
  5. ==4137== Command: ./echo
  6. ==4137==
  7. ==4137== For interactive control, run 'callgrind_control -h'.
  8. pagesize:4096
  9. count :0
  10. ==4137==
  11. ==4137== Events : Ir
  12. ==4137== Collected : 296028
  13. ==4137==
  14. ==4137== I refs: 296,028

就会生成 callgrind.out.4137文件,可以用callgrind_annotate打开,其中左侧的Ir代表指令数,约大的值越是优化的热点参考位置,例如:

  1. $ callgrind_annotate callgrind.out.4137 /home/dan/work/37net/src/37EventLoop.c | grep -v "???"
  2. --------------------------------------------------------------------------------
  3. Profile data file 'callgrind.out.4137' (creator: callgrind-3.13.0)
  4. --------------------------------------------------------------------------------
  5. I1 cache:
  6. D1 cache:
  7. LL cache:
  8. Timerange: Basic block 0 - 48715
  9. Trigger: Program termination
  10. Profiled target: ./echo (PID 4137, part 1)
  11. Events recorded: Ir
  12. Events shown: Ir
  13. Event sort order: Ir
  14. Thresholds: 99
  15. Include dirs:
  16. User annotated: /home/dan/work/37net/src/37EventLoop.c
  17. Auto-annotation: off
  18. --------------------------------------------------------------------------------
  19. Ir
  20. --------------------------------------------------------------------------------
  21. 296,028 PROGRAM TOTALS
  22. --------------------------------------------------------------------------------
  23. Ir file:function
  24. --------------------------------------------------------------------------------
  25. 120,092 /home/dan/work/37net/src/37EventLoop.c:CreateEventLoop [/home/dan/work/37net/example/build/bin/echo]
  26. 140 /home/dan/work/37net/src/37Socket.c:CreateServer [/home/dan/work/37net/example/build/bin/echo]
  27. --------------------------------------------------------------------------------
  28. -- User-annotated source: /home/dan/work/37net/src/37EventLoop.c
  29. --------------------------------------------------------------------------------
  30. Ir
  31. -- line 9 ----------------------------------------
  32. . typedef struct Epoll37 {
  33. . int m_iEfd;
  34. . struct epoll_event* m_EpollEvents;
  35. . } Epoll37;
  36. .
  37. . int iDone = 0;
  38. .
  39. . inline EventLoop37* CreateEventLoop(int iSize)
  40. 4 {
  41. 1 EventLoop37* pstEventLoop = NULL;
  42. 10 if ((pstEventLoop = malloc(sizeof(EventLoop37))) == NULL)
  43. . {
  44. . goto ERROR;
  45. . }
  46. .
  47. 3 pstEventLoop->m_iSize = iSize;
  48. 9 pstEventLoop->m_pstEvents = malloc(sizeof(Event37) * (uint32_t)(iSize));
  49. 9 pstEventLoop->m_pstFiredEvents = malloc(sizeof(FiredEvent37) * (uint32_t)(iSize));
  50. .
  51. 8 if(pstEventLoop->m_pstEvents == NULL || pstEventLoop->m_pstFiredEvents == NULL)
  52. . {
  53. . goto ERROR;
  54. . }
  55. .
  56. 4 Epoll37* pstEpoll = malloc(sizeof(Epoll37));
  57. 2 if(pstEpoll == NULL)
  58. . {
  59. . goto ERROR;
  60. . }
  61. .
  62. 12 pstEpoll->m_EpollEvents = malloc(sizeof(struct epoll_event) * (uint32_t)(iSize));
  63. 4 if(pstEpoll->m_EpollEvents == NULL)
  64. . {
  65. . goto ERROR;
  66. . }
  67. .
  68. 9 pstEpoll->m_iEfd = epoll_create1(EPOLL_CLOEXEC);
  69. 4 if(pstEpoll->m_iEfd == -1)
  70. . {
  71. . goto ERROR;
  72. . }
  73. .
  74. . int i;
  75. 50,006 for(i = 0; i < pstEventLoop->m_iSize; i++)
  76. . {
  77. 70,000 pstEventLoop->m_pstEvents[i].m_iAction = 0;
  78. . }
  79. .
  80. 3 pstEventLoop->m_pstEpoll = pstEpoll;
  81. 2 return pstEventLoop;
  82. .
  83. . ERROR:
  84. . if(pstEpoll != NULL)
  85. . {
  86. . free(pstEpoll->m_EpollEvents);
  87. . free(pstEpoll);
  88. . }
  89. .
  90. -- line 66 ----------------------------------------
  91. -- line 68 ----------------------------------------
  92. . {
  93. . free(pstEventLoop->m_pstEvents);
  94. . free(pstEventLoop->m_pstFiredEvents);
  95. . free(pstEventLoop);
  96. . }
  97. .
  98. . return NULL;
  99. .
  100. 2 }
  101. .
  102. . inline int AddEvent(EventLoop37* pstEventLoop, int iFd, int iAction, Handle* pstHandle, void* pstUserData)
  103. 8 {
  104. 4 if(iFd > pstEventLoop->m_iSize)
  105. . {
  106. . return -1;
  107. . }
  108. .
  109. 7 Event37* e = &(pstEventLoop->m_pstEvents[iFd]);
  110. 3 Epoll37* ep = pstEventLoop->m_pstEpoll;
  111. .
  112. . struct epoll_event ee;
  113. . // bzero(&ee, sizeof(struct epoll_event));
  114. . // ee.events = 0;
  115. .
  116. 1 int op = EPOLL_CTL_ADD;
  117. 4 if(e->m_iAction != 0)
  118. . {
  119. . op = EPOLL_CTL_MOD;
  120. . }
  121. .
  122. 6 e->m_iAction |= iAction;
  123. 3 e->m_pstUserData = pstUserData;
  124. .
  125. 4 if(iAction & EPOLLIN)
  126. . {
  127. 3 e->m_pstHandleRead = pstHandle;
  128. . }
  129. .
  130. 4 if(iAction & EPOLLOUT)
  131. . {
  132. . e->m_pstHandleWrite = pstHandle;
  133. . }
  134. 3 ee.events = (uint32_t)(e->m_iAction);
  135. 2 ee.data.fd = iFd;
  136. 14 if(epoll_ctl(ep->m_iEfd, op, iFd, &ee) == -1)
  137. . {
  138. . return -1;
  139. . }
  140. .
  141. 1 return 0;
  142. 2 }
  143. .
  144. . inline int DelEvent(EventLoop37* pstEventLoop, int iFd, int iAction)
  145. . {
  146. . if(iFd > pstEventLoop->m_iSize)
  147. . {
  148. . return -1;
  149. . }
  150. .
  151. -- line 126 ----------------------------------------
  152. -- line 152 ----------------------------------------
  153. . }
  154. .
  155. . }
  156. . return 0;
  157. . }
  158. .
  159. .
  160. . inline int Poll(EventLoop37* pstEventLoop)
  161. 4 {
  162. 3 Epoll37* ep = pstEventLoop->m_pstEpoll;
  163. 15 int fired = epoll_wait(ep->m_iEfd, ep->m_EpollEvents, pstEventLoop->m_iSize, 10000);
  164. .
  165. . int i;
  166. 5 for(i = 0; i < fired; i++)
  167. . {
  168. . struct epoll_event* e = ep->m_EpollEvents + i;
  169. . if(e->events & (EPOLLIN | EPOLLPRI | EPOLLRDHUP))
  170. . {
  171. . pstEventLoop->m_pstFiredEvents[i].m_iFd = e->data.fd;
  172. . pstEventLoop->m_pstFiredEvents[i].m_iAction = EPOLLIN;
  173. . }
  174. .
  175. . if(e->events & EPOLLOUT)
  176. . {
  177. . pstEventLoop->m_pstFiredEvents[i].m_iFd = e->data.fd;
  178. . pstEventLoop->m_pstFiredEvents[i].m_iAction = EPOLLOUT;
  179. . }
  180. . }
  181. 1 return fired;
  182. 2 }
  183. .
  184. .
  185. . inline int ProcessFired(EventLoop37* pstEventLoop)
  186. 4 {
  187. 4 int fired = Poll(pstEventLoop);
  188. 867 => /home/dan/work/37net/src/37EventLoop.c:Poll (1x)
  189. .
  190. . int i;
  191. 5 for(i = 0; i < fired; i++)
  192. . {
  193. . int fd = pstEventLoop->m_pstFiredEvents[i].m_iFd;
  194. . int iAction = pstEventLoop->m_pstFiredEvents[i].m_iAction;
  195. . Event37* e = &(pstEventLoop->m_pstEvents[fd]);
  196. . if(iAction & EPOLLIN)
  197. . {
  198. . e->m_pstHandleRead(pstEventLoop, fd, e->m_pstUserData, iAction);
  199. . }
  200. -- line 197 ----------------------------------------
  201. -- line 198 ----------------------------------------
  202. . if(iAction & EPOLLOUT)
  203. . {
  204. . e->m_pstHandleWrite(pstEventLoop, fd, e->m_pstUserData, iAction);
  205. . }
  206. .
  207. . iDone++;
  208. . }
  209. .
  210. 1 return iDone;
  211. 2 }
  212. .
  213. .
  214. . inline void Run(EventLoop37* pstEventLoop)
  215. 4 {
  216. . // while(!pstEventLoop->m_iStop)
  217. . {
  218. 3 ProcessFired(pstEventLoop);
  219. 883 => /home/dan/work/37net/src/37EventLoop.c:ProcessFired (1x)
  220. . }
  221. 2 }
  222. .
  223. . inline void Stop(EventLoop37* pstEventLoop)
  224. . {
  225. . Epoll37* ep = pstEventLoop->m_pstEpoll;
  226. . close(ep->m_iEfd);
  227. . free(ep->m_EpollEvents);
  228. . free(pstEventLoop->m_pstEpoll);
  229. . free(pstEventLoop->m_pstEvents);
  230. -- line 224 ----------------------------------------
  231. --------------------------------------------------------------------------------
  232. Ir
  233. --------------------------------------------------------------------------------
  234. 41 percentage of events annotated

KCachegrind

本文使用的KCachegrind版本为https://github.com/KDE/kcachegrind

如果Linux里有KDE可以用KCachegrind打开callgrind.out.* ,如果需要显示源代码,需要在Settings里Configure KCachegrind添加源代码位置,例如:

  1. Ir 代表指令数热点,也就是需要进行优化的参考位置。
  2. Ir per call 代表指令的数量

demo

proc

可以通过该文件查看进程的内存信息

查看指定进程的代码区、数据区、堆区、共享库、共享内存、内存映射、栈区、内核区的虚拟内存空间地址,例如:

  1. 结果每个域为
  2. 虚拟内存开始地址-结束地址
  3. 可读|可写|可执行 私有|共享
  4. 内存映射的文件偏移量
  5. 设备号 索引节点|文件号
  6. 路径
  7. 其中输出结果中没有路径名的为mmap创建的匿名映射
  8. $ cat /proc/16078/maps
  9. 00400000-00403000 r-xp 00000000 08:03 103040261 /home/dan/work/37net/example/build/bin/echo
  10. 00602000-00603000 r--p 00002000 08:03 103040261 /home/dan/work/37net/example/build/bin/echo
  11. 00603000-00604000 rw-p 00003000 08:03 103040261 /home/dan/work/37net/example/build/bin/echo
  12. 02470000-024c1000 rw-p 00000000 00:00 0 [heap]
  13. 7f065caba000-7f065cc7c000 r-xp 00000000 08:03 74554 /usr/lib64/libc-2.17.so
  14. 7f065cc7c000-7f065ce7c000 ---p 001c2000 08:03 74554 /usr/lib64/libc-2.17.so
  15. 7f065ce7c000-7f065ce80000 r--p 001c2000 08:03 74554 /usr/lib64/libc-2.17.so
  16. 7f065ce80000-7f065ce82000 rw-p 001c6000 08:03 74554 /usr/lib64/libc-2.17.so
  17. 7f065ce82000-7f065ce87000 rw-p 00000000 00:00 0
  18. 7f065ce87000-7f065cea9000 r-xp 00000000 08:03 74547 /usr/lib64/ld-2.17.so
  19. 7f065d04e000-7f065d0a0000 rw-p 00000000 00:00 0
  20. 7f065d0a6000-7f065d0a8000 rw-p 00000000 00:00 0
  21. 7f065d0a8000-7f065d0a9000 r--p 00021000 08:03 74547 /usr/lib64/ld-2.17.so
  22. 7f065d0a9000-7f065d0aa000 rw-p 00022000 08:03 74547 /usr/lib64/ld-2.17.so
  23. 7f065d0aa000-7f065d0ab000 rw-p 00000000 00:00 0
  24. 7ffe80a4d000-7ffe80a6e000 rw-p 00000000 00:00 0 [stack]
  25. 7ffe80b7b000-7ffe80b7d000 r-xp 00000000 00:00 0 [vdso]
  26. ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

查看指定进程的总体内存信息,例如:

  1. 输出结果中
  2. VmSize 代表占用虚拟内存的大小
  3. VmRSS 代表实际使用的物理内存的大小
  4. VmStk 代表使用的栈虚拟内存大小
  5. VmData 代表数据段的虚拟内存大小
  6. VmExe 代表代码段虚拟内存大小
  7. VmLib 代表动态库的虚拟内存大小
  8. Threads 代表已经使用的线程数
  9. $ cat /proc/16078/status
  10. Name: echo
  11. Umask: 0002
  12. State: S (sleeping)
  13. Tgid: 16078
  14. Ngid: 0
  15. Pid: 16078
  16. PPid: 14273
  17. TracerPid: 0
  18. Uid: 1000 1000 1000 1000
  19. Gid: 1000 1000 1000 1000
  20. FDSize: 256
  21. Groups: 10 1000
  22. VmPeak: 4860 kB
  23. VmSize: 4860 kB
  24. VmLck: 0 kB
  25. VmPin: 0 kB
  26. VmHWM: 880 kB
  27. VmRSS: 880 kB
  28. RssAnon: 416 kB
  29. RssFile: 464 kB
  30. RssShmem: 0 kB
  31. VmData: 692 kB
  32. VmStk: 132 kB
  33. VmExe: 12 kB
  34. VmLib: 1936 kB
  35. VmPTE: 32 kB
  36. VmSwap: 0 kB
  37. Threads: 1
  38. SigQ: 0/31936
  39. SigPnd: 0000000000000000
  40. ShdPnd: 0000000000000000
  41. SigBlk: 0000000000000000
  42. SigIgn: 0000000000001000
  43. SigCgt: 0000000000000002
  44. CapInh: 0000000000000000
  45. CapPrm: 0000000000000000
  46. CapEff: 0000000000000000
  47. CapBnd: 0000001fffffffff
  48. CapAmb: 0000000000000000
  49. Seccomp: 0
  50. Speculation_Store_Bypass: vulnerable
  51. Cpus_allowed: 3f
  52. Cpus_allowed_list: 0-5
  53. Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
  54. Mems_allowed_list: 0
  55. voluntary_ctxt_switches: 147116
  56. nonvoluntary_ctxt_switches: 392

查看一个进程的代码区、数据区、堆区、共享库、共享内存、内存映射、栈区、内核区所占用的内存信息,例如:

  1. 输出结果中
  2. Size 代表占用虚拟内存的大小
  3. Rss 代表实际使用物理内存(包含共享库占用的内存)
  4. Shared_Clean 代表未被修改的共享内存page大小,换页无需写入磁盘
  5. Shared_Dirty 代表被修改了共享内存page大小,换页需写入磁盘
  6. Private_Clean 代表未被修改的私有内存page大小,换页无需写入磁盘
  7. Private_Dirty 代表被修改的私有内存page大小,换页需写入磁盘
  8. $ cat /proc/16078/smaps
  9. 00400000-00403000 r-xp 00000000 08:03 103040261 /home/dan/work/37net/example/build/bin/echo
  10. Size: 12 kB
  11. Rss: 8 kB
  12. Pss: 8 kB
  13. Shared_Clean: 0 kB
  14. Shared_Dirty: 0 kB
  15. Private_Clean: 8 kB
  16. Private_Dirty: 0 kB
  17. Referenced: 8 kB
  18. Anonymous: 0 kB
  19. AnonHugePages: 0 kB
  20. Swap: 0 kB
  21. KernelPageSize: 4 kB
  22. MMUPageSize: 4 kB
  23. Locked: 0 kB
  24. VmFlags: rd ex mr mp me dw sd
  25. 00602000-00603000 r--p 00002000 08:03 103040261 /home/dan/work/37net/example/build/bin/echo
  26. Size: 4 kB
  27. Rss: 4 kB
  28. Pss: 4 kB
  29. Shared_Clean: 0 kB
  30. Shared_Dirty: 0 kB
  31. Private_Clean: 0 kB
  32. Private_Dirty: 4 kB
  33. Referenced: 4 kB
  34. Anonymous: 4 kB
  35. AnonHugePages: 0 kB
  36. Swap: 0 kB
  37. KernelPageSize: 4 kB
  38. MMUPageSize: 4 kB
  39. Locked: 0 kB
  40. VmFlags: rd mr mp me dw ac sd
  41. 00603000-00604000 rw-p 00003000 08:03 103040261 /home/dan/work/37net/example/build/bin/echo
  42. Size: 4 kB
  43. Rss: 4 kB
  44. Pss: 4 kB
  45. Shared_Clean: 0 kB
  46. Shared_Dirty: 0 kB
  47. Private_Clean: 0 kB
  48. Private_Dirty: 4 kB
  49. Referenced: 4 kB
  50. Anonymous: 4 kB
  51. AnonHugePages: 0 kB
  52. Swap: 0 kB
  53. KernelPageSize: 4 kB
  54. MMUPageSize: 4 kB
  55. Locked: 0 kB
  56. VmFlags: rd wr mr mp me dw ac sd
  57. 02470000-024c1000 rw-p 00000000 00:00 0 [heap]
  58. Size: 324 kB
  59. Rss: 12 kB
  60. Pss: 12 kB
  61. Shared_Clean: 0 kB
  62. Shared_Dirty: 0 kB
  63. Private_Clean: 0 kB
  64. Private_Dirty: 12 kB
  65. Referenced: 12 kB
  66. Anonymous: 12 kB
  67. AnonHugePages: 0 kB
  68. Swap: 0 kB
  69. KernelPageSize: 4 kB
  70. MMUPageSize: 4 kB
  71. Locked: 0 kB
  72. VmFlags: rd wr mr mp me ac sd
  73. 7f065caba000-7f065cc7c000 r-xp 00000000 08:03 74554 /usr/lib64/libc-2.17.so
  74. Size: 1800 kB
  75. Rss: 372 kB
  76. Pss: 20 kB
  77. Shared_Clean: 372 kB
  78. Shared_Dirty: 0 kB
  79. Private_Clean: 0 kB
  80. Private_Dirty: 0 kB
  81. Referenced: 372 kB
  82. Anonymous: 0 kB
  83. AnonHugePages: 0 kB
  84. Swap: 0 kB
  85. KernelPageSize: 4 kB
  86. MMUPageSize: 4 kB
  87. Locked: 0 kB
  88. VmFlags: rd ex mr mp me sd
  89. ......

网络

ss

可以通过该工具查看网络连接的信息

查看本地监听socket的信息,例如:

  1. $ ss -ntupl
  2. Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
  3. udp UNCONN 0 0 *:68 *:*
  4. tcp LISTEN 0 128 *:22 *:*
  5. tcp LISTEN 0 128 *:7737 *:* users:(("echo",pid=15870,fd=3))
  6. tcp LISTEN 0 80 :::3306 :::*
  7. tcp LISTEN 0 128 :::22 :::*
  8. 其中参数
  9. -n 代表显示IP地址
  10. -t 代表显示tcp连接
  11. -u 代表显示udp连接
  12. -p 显示使用该socket的进程
  13. -l 显示监听socket

启动客户端,查看连接,例如:

  1. $ ss -ntup
  2. Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
  3. tcp ESTAB 370828 0 192.168.0.45:7737 192.168.0.115:42188

显示更多tcp连接细节,例如:

  1. $ ss -ntupi
  2. Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
  3. tcp ESTAB 0 0 192.168.0.45:7737 192.168.0.115:42188 users:(("echo",pid=15870,fd=5))
  4. cubic wscale:7,7 rto:205 rtt:3/1.5 ato:40 mss:1448 rcvmss:1448 advmss:1448 cwnd:10 bytes_received:3008400 segs_out:1981 segs_in:40739 send 38.6Mbps lastsnd:4772 lastack:1677 pacing_rate 77.2Mbps rcv_rtt:5.75 rcv_space:29153
  5. 其中参数
  6. -i 代表显示更多tcp细节

其他详细参数请参考man ss

netstat

可以通过该工具查看网络连接的情况

  1. # netstat -tnap
  2. Active Internet connections (servers and established)
  3. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  4. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3356/sshd
  5. tcp 0 0 0.0.0.0:7737 0.0.0.0:* LISTEN 16078/./echo
  6. tcp6 0 0 :::3306 :::* LISTEN 3526/mysqld
  7. tcp6 0 0 :::22 :::* LISTEN 3356/sshd
  8. 其中参数
  9. -t 代表显示tcp连接
  10. -n 代表显示ip而不进行解析
  11. -a 代表显示处于监听和非监听的socket信息
  12. -p 显示使用该socket的进程

启动客户端

  1. # netstat -tnap
  2. Active Internet connections (servers and established)
  3. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  4. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3356/sshd
  5. tcp 0 0 0.0.0.0:7737 0.0.0.0:* LISTEN 16078/./echo
  6. tcp 2680 0 192.168.0.45:7737 192.168.0.115:42190 ESTABLISHED 16078/./echo
  7. tcp6 0 0 :::3306 :::* LISTEN 3526/mysqld
  8. tcp6 0 0 :::22 :::* LISTEN 3356/sshd

其他详细参数请参考man netstat

系统

lsof

可以通过该工具查看进程的文件描述符,输出的结果如:

  1. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  2. 进程名字 进程ID 所属用户 文件描述符 文件类型 设备 文件大小 索引节点 文件名称

其中 FD:

  1. cwd 代表当前工作目录
  2. rtd 代表根目录
  3. txt 代表程序代码和数据
  4. mem 代表内存映射的文件
  5. NOFD 代表文件描述符无法打开
  6. 数字+后缀 比如 0u,1u,2u,3u,4r,5w,6u
  7. 后缀r代表该文件描述符进行读访问
  8. 后缀w代表该文件描述符进行写访问
  9. 后缀u代表该文件描述符进行读写访问

其中 TYPE:

  1. REG 代表普通文件
  2. DIR 代表目录
  3. CHR 代表字符文件
  4. IPV4 代表ipv4套接字
  5. FIFO 代表FIFO文件
  6. a_inode 代表系统特殊文件
  7. unix 代表 UNIX domain 套接字
  8. PIPE 代表PIPE文件

其他详细参数请参考man lsof

查看指定用户的全部文件描述符信息,例子:

  1. lsof -u [USER]
  2. USER: 用户名
  3. $ lsof -u dan
  4. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  5. sshd 3853 dan cwd unknown /proc/3853/cwd (readlink: Permission denied)
  6. sshd 3853 dan rtd unknown /proc/3853/root (readlink: Permission denied)
  7. sshd 3853 dan txt unknown /proc/3853/exe (readlink: Permission denied)
  8. sshd 3853 dan NOFD /proc/3853/fd (opendir: Permission denied)
  9. bash 3854 dan cwd DIR 8,3 35 103040265 /home/dan/work/37net/example/build/bin
  10. bash 3854 dan rtd DIR 8,3 224 64 /
  11. bash 3854 dan txt REG 8,3 964608 100664772 /usr/bin/bash
  12. bash 3854 dan mem REG 8,3 106075056 33608548 /usr/lib/locale/locale-archive
  13. bash 3854 dan mem REG 8,3 61624 74572 /usr/lib64/libnss_files-2.17.so
  14. bash 3854 dan mem REG 8,3 2151672 74554 /usr/lib64/libc-2.17.so
  15. bash 3854 dan mem REG 8,3 19288 74560 /usr/lib64/libdl-2.17.so
  16. bash 3854 dan mem REG 8,3 174576 109034 /usr/lib64/libtinfo.so.5.9
  17. bash 3854 dan mem REG 8,3 163400 74547 /usr/lib64/ld-2.17.so
  18. bash 3854 dan mem REG 8,3 26254 94467 /usr/lib64/gconv/gconv-modules.cache
  19. bash 3854 dan 0u CHR 136,0 0t0 3 /dev/pts/0
  20. bash 3854 dan 1u CHR 136,0 0t0 3 /dev/pts/0
  21. bash 3854 dan 2u CHR 136,0 0t0 3 /dev/pts/0
  22. bash 3854 dan 255u CHR 136,0 0t0 3 /dev/pts/0
  23. bash 4463 dan cwd DIR 8,3 4096 103241941 /home/dan/work/leafserver/src
  24. bash 4463 dan rtd DIR 8,3 224 64 /
  25. bash 4463 dan txt REG 8,3 964608 100664772 /usr/bin/bash
  26. ......

查看当前用户网络相关的文件描述符信息,例子:

  1. lsof -i
  2. $ lsof -i
  3. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  4. echo 10506 dan 3u IPv4 46129 0t0 TCP *:7737 (LISTEN)

查看当前用户符合条件的网络相关的文件描述符信息,例子:

  1. lsof -i [ip地址类型] [协议] [@ip] [:服务或者端口]
  2. ip地址类型: 4代表ipv4 6代表ipv6
  3. 协议: tcpudp
  4. ip: ip地址
  5. 服务或者端口: FTPSSH、端口号
  6. $ ./echo
  7. $ lsof -i tcp:7737
  8. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  9. echo 10506 dan 3u IPv4 46129 0t0 TCP *:7737 (LISTEN)

查看当前用户指定进程的文件描述符信息,例子:

  1. lsof -p PID
  2. PID: 进程id
  3. $ lsof -p 10506
  4. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  5. echo 10506 dan cwd DIR 8,3 35 103040265 /home/dan/work/37net/example/build/bin
  6. echo 10506 dan rtd DIR 8,3 224 64 /
  7. echo 10506 dan txt REG 8,3 29120 103040261 /home/dan/work/37net/example/build/bin/echo
  8. echo 10506 dan mem REG 8,3 2151672 74554 /usr/lib64/libc-2.17.so
  9. echo 10506 dan mem REG 8,3 163400 74547 /usr/lib64/ld-2.17.so
  10. echo 10506 dan 0u CHR 136,0 0t0 3 /dev/pts/0
  11. echo 10506 dan 1u CHR 136,0 0t0 3 /dev/pts/0
  12. echo 10506 dan 2u CHR 136,0 0t0 3 /dev/pts/0
  13. echo 10506 dan 3u IPv4 46129 0t0 TCP *:7737 (LISTEN)
  14. echo 10506 dan 4u a_inode 0,10 0 6397 [eventpoll]

查看指定的文件描述符的信息,例子:

  1. lsof -d FD
  2. FD: 文件描述符
  3. $ lsof -d7
  4. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  5. echo 14323 dan 7u IPv4 66035 0t0 TCP welugame.com:7737->welugame.com:59542 (ESTABLISHED)
  6. testpr 14559 dan 7u IPv4 62438 0t0 TCP welugame.com:59544->welugame.com:7737 (ESTABLISHED)
  7. lsof 14568 dan 7w FIFO 0,9 0t0 72855 pipe

查看指定进程名的信息,例子:

  1. lsof -c COMMAND
  2. COMMAND: 进程名
  3. # lsof -c mysqld (or mysql)
  4. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  5. mysqld 3526 mysql cwd DIR 8,3 4096 34326207 /var/lib/mysql
  6. mysqld 3526 mysql rtd DIR 8,3 224 64 /
  7. mysqld 3526 mysql txt REG 8,3 251284320 481669 /usr/sbin/mysqld
  8. mysqld 3526 mysql mem REG 8,3 61624 74572 /usr/lib64/libnss_files-2.17.so
  9. mysqld 3526 mysql mem REG 8,3 202312 34326204 /usr/lib64/mysql/plugin/validate_password.so
  10. mysqld 3526 mysql DEL REG 0,11 25793 /[aio]
  11. mysqld 3526 mysql DEL REG 0,11 25792 /[aio]
  12. mysqld 3526 mysql DEL REG 0,11 25791 /[aio]
  13. mysqld 3526 mysql DEL REG 0,11 25790 /[aio]
  14. mysqld 3526 mysql DEL REG 0,11 25789 /[aio]
  15. mysqld 3526 mysql DEL REG 0,11 25788 /[aio]
  16. mysqld 3526 mysql DEL REG 0,11 25787 /[aio]
  17. mysqld 3526 mysql DEL REG 0,11 25786 /[aio]
  18. mysqld 3526 mysql DEL REG 0,11 25785 /[aio]
  19. mysqld 3526 mysql mem REG 8,3 11448 64503 /usr/lib64/libfreebl3.so
  20. mysqld 3526 mysql mem REG 8,3 2151672 74554 /usr/lib64/libc-2.17.so
  21. mysqld 3526 mysql mem REG 8,3 88776 84 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
  22. mysqld 3526 mysql mem REG 8,3 1137016 74562 /usr/lib64/libm-2.17.so
  23. mysqld 3526 mysql mem REG 8,3 991616 94474 /usr/lib64/libstdc++.so.6.0.19
  24. mysqld 3526 mysql mem REG 8,3 43776 74584 /usr/lib64/librt-2.17.so
  25. mysqld 3526 mysql mem REG 8,3 19288 74560 /usr/lib64/libdl-2.17.so
  26. mysqld 3526 mysql mem REG 8,3 40664 74558 /usr/lib64/libcrypt-2.17.so
  27. mysqld 3526 mysql mem REG 8,3 50752 313857 /usr/lib64/libnuma.so.1
  28. mysqld 3526 mysql mem REG 8,3 6264 287120 /usr/lib64/libaio.so.1.0.1
  29. mysqld 3526 mysql mem REG 8,3 141968 74580 /usr/lib64/libpthread-2.17.so
  30. mysqld 3526 mysql mem REG 8,3 163400 74547 /usr/lib64/ld-2.17.so
  31. mysqld 3526 mysql DEL REG 0,11 25784 /[aio]
  32. mysqld 3526 mysql DEL REG 0,11 25783 /[aio]
  33. mysqld 3526 mysql DEL REG 0,11 25782 /[aio]
  34. mysqld 3526 mysql 0r CHR 1,3 0t0 1028 /dev/null

定时刷新信息,例子:

  1. $ lsof -r T
  2. T: 刷新时间
  3. $ lsof -c echo -r 1
  4. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  5. echo 14323 dan cwd DIR 8,3 35 103040265 /home/dan/work/37net/example/build/bin
  6. echo 14323 dan rtd DIR 8,3 224 64 /
  7. echo 14323 dan txt REG 8,3 29120 103040261 /home/dan/work/37net/example/build/bin/echo
  8. echo 14323 dan mem REG 8,3 2151672 74554 /usr/lib64/libc-2.17.so
  9. echo 14323 dan mem REG 8,3 163400 74547 /usr/lib64/ld-2.17.so
  10. echo 14323 dan 0u CHR 136,1 0t0 4 /dev/pts/1
  11. echo 14323 dan 1u CHR 136,1 0t0 4 /dev/pts/1
  12. echo 14323 dan 2u CHR 136,1 0t0 4 /dev/pts/1
  13. echo 14323 dan 3u IPv4 62358 0t0 TCP *:7737 (LISTEN)
  14. echo 14323 dan 4u a_inode 0,10 0 6397 [eventpoll]
  15. =======
  16. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  17. echo 14323 dan cwd DIR 8,3 35 103040265 /home/dan/work/37net/example/build/bin
  18. echo 14323 dan rtd DIR 8,3 224 64 /
  19. echo 14323 dan txt REG 8,3 29120 103040261 /home/dan/work/37net/example/build/bin/echo
  20. echo 14323 dan mem REG 8,3 2151672 74554 /usr/lib64/libc-2.17.so
  21. echo 14323 dan mem REG 8,3 163400 74547 /usr/lib64/ld-2.17.so
  22. echo 14323 dan 0u CHR 136,1 0t0 4 /dev/pts/1
  23. echo 14323 dan 1u CHR 136,1 0t0 4 /dev/pts/1
  24. echo 14323 dan 2u CHR 136,1 0t0 4 /dev/pts/1
  25. echo 14323 dan 3u IPv4 62358 0t0 TCP *:7737 (LISTEN)
  26. echo 14323 dan 4u a_inode 0,10 0 6397 [eventpoll]

dstat

python实现的系统监测工具

查看 时间、cpu、磁盘、中断、上下文切换、网络包、网络字节、内存、页,例如:

  1. $ dstat -t --cpu --disk --sys --net-packet --net --mem --page
  2. ----system---- ----total-cpu-usage---- -dsk/total- ---system-- -pkt/total- -net/total- ------memory-usage----- ---paging--
  3. time |usr sys idl wai hiq siq| read writ| int csw |#recv #send| recv send| used buff cach free| in out
  4. 14-05 12:52:16| 0 1 99 0 0 0|4447B 2902B| 923 2336 | 0 0 | 0 0 | 395M 2076k 435M 7173M| 0 0
  5. 14-05 12:52:17| 0 0 100 0 0 0| 0 0 | 79 82 |1.00 1.00 | 60B 1318B| 395M 2076k 435M 7173M| 0 0
  6. 14-05 12:52:18| 0 0 100 0 0 0| 0 0 | 41 58 |1.00 1.00 | 60B 550B| 395M 2076k 435M 7173M| 0 0
  7. 14-05 12:52:19| 0 0 100 0 0 0| 0 0 | 68 80 |2.00 2.00 | 120B 610B| 395M 2076k 435M 7173M| 0 0
  8. 14-05 12:52:20| 0 0 100 0 0 0| 0 0 | 47 57 |1.00 1.00 | 60B 550B| 395M 2076k 435M 7173M| 0 0
  9. 14-05 12:52:21| 0 0 100 0 0 0| 0 0 | 51 64 |1.00 1.00 | 60B 550B| 395M 2076k 435M 7173M| 0 0
  10. 14-05 12:52:22| 0 0 100 0 0 0| 0 0 | 42 55 |1.00 1.00 | 60B 550B| 395M 2076k 435M 7173M| 0 0
  11. 14-05 12:52:23| 0 0 100 0 0 0| 0 0 | 61 75 |1.00 1.00 | 60B 550B| 395M 2076k 435M 7173M| 0 0
  12. 14-05 12:52:24| 0 0 100 0 0 0| 0 0 | 48 61 |1.00 1.00 | 60B 550B| 395M 2076k 435M 7173M| 0 0
  13. 14-05 12:52:25| 0 0 100 0 0 0| 0 0 | 42 64 |1.00 1.00 | 60B 550B| 395M 2076k 435M 7173M| 0 0
  14. 14-05 12:52:26| 0 0 100 0 0 0| 0 0 | 41 53 |1.00 1.00 | 60B 550B| 395M 2076k 435M 7173M| 0 0
  15. 14-05 12:52:27| 0 0 100 0 0 0| 0 0 | 63 84 |1.00 1.00 | 60B 550B| 395M 2076k 435M 7173M| 0 0

其中输出的结果中:

  1. time 代表输出时间
  2. usr sys idl wai hiq siq 代表 用户进程占用cpu时间 系统进程占用 空闲 等待io 硬中断 软中断
  3. read writ 代表磁盘读写
  4. int csw 代表系统中断和上下文切换
  5. #recv #send 代表收发包
  6. recv send 代表收发字节数
  7. used buff cach free 代表内存占用 写缓存的量 读缓存的量 空闲的内存量
  8. in out 代表页换入 页换出

启动测试客户端和服务器:

  1. ----system---- ----total-cpu-usage---- -dsk/total- ---system-- -pkt/total- -net/total- ------memory-usage----- ---paging--
  2. time |usr sys idl wai hiq siq| read writ| int csw |#recv #send| recv send| used buff cach free| in out
  3. 14-05 12:52:28| 0 0 100 0 0 0| 0 0 |1291 1345 | 804 644 | 53k 81k| 395M 2076k 435M 7173M| 0 0
  4. 14-05 12:52:29| 0 0 100 0 0 0| 0 0 |1022 988 | 572 456 | 38k 58k| 396M 2076k 435M 7172M| 0 0
  5. 14-05 12:52:30| 0 0 99 0 0 0| 0 0 |1282 1293 | 771 618 | 51k 78k| 397M 2076k 435M 7171M| 0 0
  6. 14-05 12:52:31| 0 0 98 0 0 1| 0 0 |1248 1559 |11.1k 11.0k| 854k 798k| 401M 2076k 435M 7167M| 0 0
  7. 14-05 12:52:32| 0 3 91 0 0 5| 0 0 |7755 1104 |20.2k 19.5k|1571k 1280k| 400M 2076k 435M 7168M| 0 0
  8. 14-05 12:52:33| 0 2 92 0 0 6| 0 0 |9155 1394 |19.4k 19.0k|1449k 1278k| 401M 2076k 435M 7167M| 0 0
  9. 14-05 12:52:34| 0 3 93 0 0 4| 0 0 |6139 1484 |18.9k 18.0k|1558k 1196k| 400M 2076k 435M 7168M| 0 0
  10. 14-05 12:52:35| 0 3 90 0 0 7| 0 0 | 11k 911 |21.7k 19.7k|1773k 1285k| 400M 2076k 435M 7168M| 0 0
  11. 14-05 12:52:36| 0 3 90 0 0 7| 0 0 | 11k 957 |20.8k 18.7k|1679k 1226k| 400M 2076k 435M 7168M| 0 0
  12. 14-05 12:52:37| 1 3 90 0 0 7| 0 0 |9499 1063 |20.1k 18.7k|1649k 1238k| 400M 2076k 435M 7168M| 0 0
  13. 14-05 12:52:38| 0 3 90 0 0 7| 0 0 | 10k 1018 |20.3k 18.6k|1671k 1215k| 400M 2076k 435M 7168M| 0 0
  14. 14-05 12:52:39| 0 4 89 0 0 7| 0 0 | 12k 875 |20.6k 18.0k|1718k 1168k| 398M 2076k 435M 7170M| 0 0
  15. 14-05 12:52:40| 0 3 91 0 0 7| 0 0 |8020 1014 |19.5k 18.4k|1592k 1229k| 399M 2076k 435M 7169M| 0 0
  16. 14-05 12:52:41| 0 2 90 0 0 8| 0 0 | 12k 1492 |19.1k 18.3k|1503k 1186k| 398M 2076k 435M 7170M| 0 0
  17. 14-05 12:52:42| 0 3 90 0 0 7| 0 0 | 10k 1145 |19.3k 17.9k|1587k 1173k| 398M 2076k 435M 7170M| 0 0
  18. 14-05 12:52:43| 0 3 89 0 0 8| 0 0 | 13k 918 |20.7k 18.2k|1709k 1176k| 398M 2076k 435M 7170M| 0 0
  19. 14-05 12:52:44| 0 3 90 0 0 8| 0 0 | 13k 1288 |20.1k 18.7k|1601k 1207k| 398M 2076k 435M 7170M| 0 0
  20. 14-05 12:52:45| 0 3 89 0 0 7| 0 0 | 11k 1326 |19.3k 17.7k|1570k 1194k| 398M 2076k 435M 7170M| 0 0
  21. 14-05 12:52:46| 0 1 98 0 0 1| 0 0 |1815 942 | 489 404 | 67k 39k| 398M 2076k 435M 7171M| 0 0
  22. 14-05 12:52:47| 0 1 98 0 0 0| 0 0 | 444 237 | 106 86.0 | 57k 7652B| 397M 2076k 435M 7171M| 0 0
  23. 14-05 12:52:48| 0 1 99 0 0 0| 0 0 | 294 151 |57.0 47.0 | 28k 4326B| 397M 2076k 435M 7171M| 0 0
  24. 14-05 12:52:49| 0 1 99 0 0 0| 0 0 | 300 170 |43.0 37.0 | 18k 3774B| 397M 2076k 435M 7171M| 0 0
  25. 14-05 12:52:50| 0 1 99 0 0 0| 0 0 | 252 148 |40.0 36.0 | 17k 3612B| 397M 2076k 435M 7172M| 0 0
  26. 14-05 12:52:51| 0 0 99 0 0 0| 0 0 | 236 151 |26.0 24.0 | 10k 2616B| 397M 2076k 435M 7172M| 0 0
  27. 14-05 12:52:52| 0 0 100 0 0 0| 0 0 | 85 70 |9.00 8.00 |4344B 1124B| 396M 2076k 435M 7172M| 0 0
  28. 14-05 12:52:53| 0 1 99 0 0 0| 0 0 | 205 109 |28.0 24.0 | 13k 2516B| 396M 2076k 435M 7172M| 0 0
  29. 14-05 12:52:54| 0 0 99 0 0 0| 0 0 | 195 119 |30.0 26.0 | 16k 2648B| 396M 2076k 435M 7172M| 0 0
  30. 14-05 12:52:55| 0 0 100 0 0 0| 0 0 | 160 116 |25.0 21.0 | 12k 2206B| 396M 2076k 435M 7172M| 0 0
  31. 14-05 12:52:56| 0 1 99 0 0 0| 0 0 | 240 119 |41.0 37.0 | 21k 3494B| 396M 2076k 435M 7172M| 0 0
  32. 14-05 12:52:57| 0 1 99 0 0 0| 0 0 | 215 118 |47.0 40.0 | 26k 3668B| 396M 2076k 435M 7172M| 0 0

断开客户端:

  1. ----system---- ----total-cpu-usage---- -dsk/total- ---system-- -pkt/total- -net/total- ------memory-usage----- ---paging--
  2. time |usr sys idl wai hiq siq| read writ| int csw |#recv #send| recv send| used buff cach free| in out
  3. 14-05 12:52:58| 0 0 100 0 0 0| 0 0 | 40 58 |1.00 1.00 | 60B 550B| 396M 2076k 435M 7172M| 0 0
  4. 14-05 12:52:59| 0 0 100 0 0 0| 0 0 | 53 72 |1.00 1.00 | 60B 550B| 396M 2076k 435M 7172M| 0 0
  5. 14-05 12:53:00| 0 0 100 0 0 0| 0 0 | 50 58 |1.00 1.00 | 60B 550B| 396M 2076k 435M 7172M| 0 0
  6. 14-05 12:53:01| 0 0 100 0 0 0| 0 0 | 49 55 |1.00 1.00 | 60B 550B| 396M 2076k 435M 7172M| 0 0
  7. 14-05 12:53:02| 0 0 100 0 0 0| 0 0 | 46 57 |1.00 1.00 | 60B 550B| 396M 2076k 435M 7172M| 0 0
  8. 14-05 12:53:03| 0 0 100 0 0 0| 0 0 | 59 67 |1.00 1.00 | 60B 550B| 396M 2076k 435M 7172M| 0 0
  9. 14-05 12:53:04| 0 0 100 0 0 0| 0 0 | 56 60 |1.00 1.00 | 60B 550B| 396M 2076k 435M 7172M| 0 0
  10. 14-05 12:53:05| 0 0 100 0 0 0| 0 0 | 42 55 |1.00 1.00 | 60B 550B| 396M 2076k 435M 7172M| 0 0
  11. 14-05 12:53:06| 0 0 100 0 0 0| 0 0 | 41 55 |1.00 1.00 | 60B 550B| 396M 2076k 435M 7172M| 0 0
  12. 14-05 12:53:07| 0 0 100 0 0 0| 0 0 | 77 80 |1.00 1.00 | 60B 550B| 396M 2076k 435M 7172M| 0 0
  13. 14-05 12:53:08| 0 0 100 0 0 0| 0 0 | 50 56 |1.00 1.00 | 60B 550B| 396M 2076k 435M 7172M| 0 0
  14. 14-05 12:53:09| 0 0 100 0 0 0| 0 0 | 194 169 |31.0 1.00 |1860B 550B| 396M 2076k 435M 7172M| 0 0

其他详细参数请参考man dstat

free

查看系统内存,例如:

  1. 输出结果中buffers 为写入磁盘的缓存的物理内存大小, cache 为读取磁盘的缓存的物理内存大小。
  2. $ free -h
  3. total used free shared buff/cache available
  4. Mem: 7.8G 323M 7.0G 8.5M 473M 7.2G
  5. Swap: 2.0G 0B 2.0G
  6. $ free -w
  7. total used free shared buffers cache available
  8. Mem: 8197056 332496 7379308 8728 2076 483176 7587984
  9. Swap: 2097148 0 2097148
  10. 其中系统还有多少内存,即真正可用的内存为 free + buff/cache 或者 free + buffers + cache

其他详细参数请参考man free