# 常见日常监控 ## 系统信息 - 查看 CentOS 版本号：`cat /etc/redhat-release` --------------------------------------------------------------------- ## 综合监控 - [nmon](Nmon.md) --------------------------------------------------------------------- ## 系统负载 #### 命令：w（判断整体瓶颈） ``` 12:04:52 up 16 days, 12:54, 1 user, load average: 0.06, 0.13, 0.12 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 116.21.24.85 11:57 4.00s 16:18 0.01s w ``` - 第一行： - `12:04:52` 表示当前系统时间 - `up 16 days` 表示系统运行时间 - `1 user` 表示登录用户数 - `load average` 表示平均负载，0.06 表示一分钟内系统的平均负载值，0.13 表示五分钟内系统的平均负载值，0.12 表示十五分钟内系统的平均负载值。一般这个字不要超过服务器的 CPU 线程数（process）就没有关系。 - 查看 CPU 总的线程数：`grep 'processor' /proc/cpuinfo | sort -u | wc -l` - 第二行： - 开始表示各个登录用户的情况，当前登录者是 root，登录者 IP 116.21.24.85 - 还有一个简化版本的命令：`uptime` ``` 10:56:16 up 26 days, 20:05, 1 user, load average: 0.00, 0.01, 0.05 ``` #### 命令：vmstat（判断 RAM 和 I/0 瓶颈） - 命令：`vmstat 5 10`，每 5 秒采样一次，共 10 次。 ``` procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 72648 0 674564 0 0 0 7 0 26 1 1 99 0 0 0 0 0 72648 0 674596 0 0 0 0 442 557 1 0 99 0 0 0 0 0 72648 0 674596 0 0 0 12 438 574 0 1 99 0 0 0 0 0 72648 0 674596 0 0 0 0 430 540 0 0 100 0 0 0 0 0 72648 0 674596 0 0 0 0 448 567 0 1 99 0 0 0 0 0 72648 0 674596 0 0 0 0 459 574 1 0 99 0 0 0 0 0 72648 0 674596 0 0 0 0 425 543 0 1 99 0 0 0 0 0 72276 0 674600 0 0 0 0 480 643 2 3 95 0 0 ``` - 第二行： - `r` 表示运行和等待CPU时间片的进程数，该数字如果长期大于服务器CPU的进程数，则说明CPU不够用了。 - `b` 表示等待资源的进程数，比如等I/O，内存等。该数字如果长时间大于 1，则需要关注一下。 - `si` 表示由交换区写入到内存的数据量 - `so` 表示由内存写入到交换区的数据量 - **如果 si 和 so 的数字比较高，并且不断变化时，说明内存不够了。而且不断变化也表示对系统性能影响很大。** - `bi` 表示从块设备读取数据的量（读磁盘） - `bo` 表示从块设备写入数据的量（写磁盘） - **如果bi和bo两个数字比较高，则说明，磁盘IO压力大。** - `in` 每秒 CPU 的中断次数，包括时间中断 - `cs` 每秒上下文切换次数，例如我们调用系统函数，就要进行上下文切换，线程的切换，也要进程上下文切换，这个值要越小越好，太大了，要考虑调低线程或者进程的数目 - `wa` 表示I/O等待所占用CPU的时间比 #### 命令：sar（综合） - sar(system activity reporter 系统活动情况报告) - sar 是目前 linux 上最为全面的系统性能分析工具之一，可以从多方面对系统的活动情况进行报告。包括（文件的读写、系统调用、磁盘I/O、cpu效率、内存使用、进程活动以及IPC有关的活动） - 如果没安装，运行：`yum install -y sysstat` ##### sar 之 CPU 使用情况（判断 CPU 瓶颈） - 命令：`sar -u 5 10`，每 5 秒采样一次，共 10 次 ``` 01:57:29 PM CPU %user %nice %system %iowait %steal %idle 01:57:34 PM all 1.81 0.00 0.40 0.00 0.00 97.78 01:57:39 PM all 0.20 0.00 0.40 0.00 0.00 99.39 01:57:44 PM all 0.40 0.00 0.60 0.00 0.00 98.99 01:57:49 PM all 0.20 0.00 0.40 0.00 0.00 99.39 01:57:54 PM all 0.80 0.00 1.41 0.00 0.00 97.79 01:57:59 PM all 0.40 0.00 0.60 0.00 0.00 98.99 01:58:04 PM all 0.20 0.00 0.40 0.00 0.00 99.39 01:58:09 PM all 0.20 0.00 0.40 0.00 0.00 99.39 01:58:14 PM all 0.40 0.00 0.61 0.00 0.00 98.99 01:58:19 PM all 0.20 0.00 0.61 0.00 0.00 99.19 Average: all 0.48 0.00 0.59 0.00 0.00 98.93 ``` - 列说明： - `CPU：all` 表示统计信息为所有 CPU的平均值。 - `%user`：显示在用户级别(application)运行使用 CPU 总时间的百分比。 - `%nice`：显示在用户级别，用于nice操作，所占用 CPU总时间的百分比。 - `%system`：在核心级别(kernel)运行所使用 CPU总时间的百分比。 - `%iowait`：显示用于等待I/O操作占用 CPU总时间的百分比。 - `%steal`：管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。 - `%idle`：显示 CPU空闲时间占用 CPU总时间的百分比。 - **总结**： - 1.若 `%iowait` 的值过高，表示硬盘存在I/O瓶颈 - 2.若 `%idle` 的值高但系统响应慢时，有可能是 CPU 等待分配内存，此时应加大内存容量，可以使用内存监控命令分析内存。 - 3.若 `%idle` 的值持续低于1，则系统的 CPU 处理能力相对较低，表明系统中最需要解决的资源是 CPU。 ##### sar 之 RAM 使用情况（判断内存瓶颈） - 命令：`sar -B 5 10`，每 5 秒采样一次，共 10 次 ``` 02:32:15 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 02:32:20 PM 0.00 0.81 258.47 0.00 27.22 0.00 0.00 0.00 0.00 02:32:25 PM 0.00 0.00 611.54 0.00 300.20 0.00 0.00 0.00 0.00 02:32:30 PM 0.00 26.61 10.08 0.00 11.90 0.00 0.00 0.00 0.00 02:32:35 PM 0.00 1.62 3.64 0.00 3.84 0.00 0.00 0.00 0.00 02:32:40 PM 0.00 0.00 3.42 0.00 4.43 0.00 0.00 0.00 0.00 02:32:45 PM 0.00 0.00 3.43 0.00 3.83 0.00 0.00 0.00 0.00 02:32:50 PM 0.00 1.62 3.84 0.00 5.86 0.00 0.00 0.00 0.00 02:32:55 PM 0.00 0.00 3.41 0.00 3.82 0.00 0.00 0.00 0.00 02:33:00 PM 0.00 2.42 763.84 0.00 208.69 0.00 0.00 0.00 0.00 02:33:05 PM 0.00 13.74 2409.70 0.00 929.70 0.00 0.00 0.00 0.00 Average: 0.00 4.68 406.50 0.00 149.69 0.00 0.00 0.00 0.00 ``` - `pgpgin/s`：表示每秒从磁盘或SWAP置换到内存的字节数(KB) - `pgpgout/s`：表示每秒从内存置换到磁盘或SWAP的字节数(KB) - `fault/s`：每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor) - `majflt/s`：每秒钟产生的主缺页数 - `pgfree/s`：每秒被放入空闲队列中的页个数 - `pgscank/s`：每秒被kswapd扫描的页个数 - `pgscand/s`：每秒直接被扫描的页个数 - `pgsteal/s`：每秒钟从cache中被清除来满足内存需要的页个数 - `%vmeff`：每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比 ##### sar 之 I/O 使用情况（判断 I/O 瓶颈） - 命令：`sar -b 5 10`，每 5 秒采样一次，共 10 次 ``` 02:34:13 PM tps rtps wtps bread/s bwrtn/s 02:34:18 PM 3.03 0.00 3.03 0.00 59.80 02:34:23 PM 0.00 0.00 0.00 0.00 0.00 02:34:28 PM 0.00 0.00 0.00 0.00 0.00 02:34:33 PM 0.00 0.00 0.00 0.00 0.00 02:34:38 PM 1.61 0.00 1.61 0.00 24.80 02:34:43 PM 0.00 0.00 0.00 0.00 0.00 02:34:48 PM 0.40 0.00 0.40 0.00 4.86 02:34:53 PM 0.00 0.00 0.00 0.00 0.00 02:34:58 PM 0.00 0.00 0.00 0.00 0.00 02:35:03 PM 0.00 0.00 0.00 0.00 0.00 Average: 0.50 0.00 0.50 0.00 8.94 ``` - `tps`：每秒钟物理设备的 I/O 传输总量 - `rtps`：每秒钟从物理设备读入的数据总量 - `wtps`：每秒钟向物理设备写入的数据总量 - `bread/s`：每秒钟从物理设备读入的数据量，单位为块/s - `bwrtn/s`：每秒钟向物理设备写入的数据量，单位为块/s ##### sar 之 DEV（网卡）流量查看（判断网络瓶颈） - 命令：`sar -n DEV`，查看网卡历史流量（因为是按时间显示每棵的流量，所以有很多） - 如果要动态显示当前的网卡流量：`sar -n DEV 1` - 采样收集网卡流量：`sar -n DEV 5 10`，每 5 秒采样一次，共 10 次 - 如果要查看其他日期下的记录，可以到这个目录下：`cd /var/log/sa` 查看下记录的文件，然后选择一个文件，比如：`sar -n DEV -f /var/log/sa/sa01`） ``` 01:46:24 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 01:46:25 PM lo 3.00 3.00 0.18 0.18 0.00 0.00 0.00 01:46:25 PM eth0 4.00 4.00 0.55 0.56 0.00 0.00 0.00 ``` - `01:46:25 PM` 表示时间 - `IFACE` 表示网卡名称 - `rxpck/s` 每秒钟接收到的 **包数目**，一般如果这个数字大于 4000 一般是被攻击了。 - `txpck/s` 每秒钟发送出去的 **包数目** - `rxkB/s` 每秒钟接收到的数据量(单位kb)，一般如果这个数字大于 5000 一般是被攻击了。 - `txkB/s` 每秒钟发送出去的数据量(单位kb) - `rxcmp/s`：每秒钟接收到的压缩包数目 - `txcmp/s`：每秒钟发送出去的压缩包数目 - `txmcst/s`：每秒钟接收到的多播包的包数目 - 查看 TCP 相关的一些数据（每隔 1 秒采样一次，一共 5 次）：`sar -n TCP,ETCP 1 5` ``` Linux 3.10.0-693.2.2.el7.x86_64 (youmeek) 07/17/2018 _x86_64_ (2 CPU) 12:05:47 PM active/s passive/s iseg/s oseg/s 12:05:48 PM 0.00 0.00 1.00 0.00 12:05:47 PM atmptf/s estres/s retrans/s isegerr/s orsts/s 12:05:48 PM 0.00 0.00 0.00 0.00 0.00 12:05:48 PM active/s passive/s iseg/s oseg/s 12:05:49 PM 0.00 0.00 1.00 1.00 12:05:48 PM atmptf/s estres/s retrans/s isegerr/s orsts/s 12:05:49 PM 0.00 0.00 0.00 0.00 0.00 12:05:49 PM active/s passive/s iseg/s oseg/s 12:05:50 PM 0.00 0.00 1.00 1.00 12:05:49 PM atmptf/s estres/s retrans/s isegerr/s orsts/s 12:05:50 PM 0.00 0.00 0.00 0.00 0.00 12:05:50 PM active/s passive/s iseg/s oseg/s 12:05:51 PM 0.00 0.00 3.00 3.00 12:05:50 PM atmptf/s estres/s retrans/s isegerr/s orsts/s 12:05:51 PM 0.00 0.00 0.00 0.00 0.00 12:05:51 PM active/s passive/s iseg/s oseg/s 12:05:52 PM 0.00 0.00 1.00 1.00 12:05:51 PM atmptf/s estres/s retrans/s isegerr/s orsts/s 12:05:52 PM 0.00 0.00 0.00 0.00 0.00 Average: active/s passive/s iseg/s oseg/s Average: 0.00 0.00 1.40 1.20 Average: atmptf/s estres/s retrans/s isegerr/s orsts/s Average: 0.00 0.00 0.00 0.00 0.00 ``` ``` - active/s：每秒钟本地主动开启的 tcp 连接，也就是本地程序使用 connect() 系统调用 - passive/s：每秒钟从源端发起的 tcp 连接，也就是本地程序使用 accept() 所接受的连接 - retrans/s: 每秒钟的 tcp 重传次数 atctive 和 passive 的数目通常可以用来衡量服务器的负载：接受连接的个数（passive），下游连接的个数（active）。可以简单认为 active 为出主机的连接，passive 为入主机的连接；但这个不是很严格的说法，比如 loalhost 和 localhost 之间的连接。 来自：https://zhuanlan.zhihu.com/p/39893236 ``` --------------------------------------------------------------------- ## CPU 监控 #### CPU 的基本信息查看 - Demo CPU 型号：[Intel® Xeon® Processor E5-2620 v2(15M Cache, 2.10 GHz)](http://ark.intel.com/products/75789/Intel-Xeon-Processor-E5-2620-v2-15M-Cache-2_10-GHz) - 该 CPU 显示的数据中有一项这个要注意：`Intel® Hyper-Threading Technology` 是 `Yes`。表示该 CPU 支持超线程 - `cat /proc/cpuinfo`，查看 CPU 总体信息 - `grep 'physical id' /proc/cpuinfo | sort -u | wc -l`，查看物理 CPU 个数 - 结果：2 - 物理 CPU：物理 CPU 也就是机器外面就能看到的一个个 CPU，每个物理 CPU 还带有单独的风扇 - `grep 'core id' /proc/cpuinfo | sort -u | wc -l`，查看每个物理 CPU 的核心数量 - 结果：6，因为每个物理 CPU 是 6，所有 2 个物理 CPU 的总核心数量应该是：12 - 核心数：一个核心就是一个物理线程，英特尔有个超线程技术可以把一个物理线程模拟出两个线程来用，充分发挥 CPU 性能，意思是一个核心可以有多个线程。 - `grep 'processor' /proc/cpuinfo | sort -u | wc -l`，查看 CPU 总的线程数，一般也叫做：逻辑 CPU 数量 - 结果：24，正常情况下：CPU 的总核心数量 == CPU 线程数，但是如果该 CPU 支持超线程，那结果是：CPU 的总核心数量 X 2 == CPU 线程数 - 线程数：线程数是一种逻辑的概念，简单地说，就是模拟出的 CPU 核心数。比如，可以通过一个 CPU 核心数模拟出 2 线程的 CPU，也就是说，这个单核心的 CPU 被模拟成了一个类似双核心 CPU 的功能。 #### CPU 监控 - Linux 的 CPU 简单监控一般简单 - 常用命令就是 `top` - 命令：`top -bn1`，可以完全显示所有进程出来，但是不能实时展示数据，只能暂时命令当时的数据。 - `top` 可以动态显示进程所占的系统资源，每隔 3 秒变一次，占用系统资源最高的进程放最前面。 - 在 `top` 命令状态下还可以按数字键 1 显示各个 CPU 线程使用状态 - 在 `top` 命令状态下按 shfit + m 可以按照 **内存使用** 大小排序 - 在 `top` 命令状态下按 shfit + p 可以按照 **CPU 使用** 大小排序 - 展示数据上，%CPU 表示进程占用的 CPU 百分比，%MEM 表示进程占用的内存百分比 - mac 下不一样：要先输入 o，然后输入 cpu 则按 cpu 使用量排序，输入 rsize 则按内存使用量排序。 #### CPU 其他工具 - htop 综合工具：`yum install -y htop` - 这几篇文章讲得很好，我没必要再贴过来了，大家自己看： - [htop 命令完胜 top 命令](http://blog.51cto.com/215687833/1788493) - [htop 命令详解](https://blog.csdn.net/freeking101/article/details/79173903) - mpstat 实时监控 CPU 状态：`yum install -y sysstat` - 可以具体到某个核心，比如我有 2 核的 CPU，因为 CPU 核心下标是从 0 开始，所以我要查看 0 的状况（间隔 3 秒获取一次指标，一共获取 5 次）：`mpstat -P 0 3 5` - 打印总 CPU 和各个核心指标：`mpstat -P ALL 1` - 获取所有核心的平均值：`mpstat 3 5` ``` Linux 3.10.0-693.2.2.el7.x86_64 (iZwz998aag1ggy168n3wg2Z) 06/23/2018 _x86_64_ (2 CPU) 11:44:52 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 11:44:53 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 11:44:54 AM 0 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 11:44:55 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 11:44:56 AM 0 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 11:44:57 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 Average: 0 0.20 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.60 ``` - %usr 用户进程消耗 CPU 情况 - %sys 系统进程消耗 CPU 情况 - %iowait 表示 CPU 等待 IO 时间占整个 CPU 周期的百分比 - %idle 显示 CPU 空闲时间占用 CPU 总时间的百分比 #### 类似 top 的 pidstat - 安装：`yum install -y sysstat` - 每隔 2 秒采样一次，一共 5 次：`pidstat 2 5` ``` Linux 3.10.0-693.el7.x86_64 (youmeek) 07/17/2018 _x86_64_ (8 CPU) 11:52:58 AM UID PID %usr %system %guest %CPU CPU Command 11:53:00 AM 0 16813 0.50 0.99 0.00 1.49 1 pidstat 11:53:00 AM 0 24757 50.99 12.87 0.00 63.86 0 java 11:53:00 AM 0 24799 60.40 3.47 0.00 63.86 5 java 11:53:00 AM 0 24841 99.50 7.43 0.00 100.00 0 java 11:53:00 AM UID PID %usr %system %guest %CPU CPU Command 11:53:02 AM 0 24757 56.50 0.50 0.00 57.00 0 java 11:53:02 AM 0 24799 100.00 6.50 0.00 100.00 5 java 11:53:02 AM 0 24841 58.00 2.50 0.00 60.50 0 java 11:53:02 AM UID PID %usr %system %guest %CPU CPU Command 11:53:04 AM 0 16813 0.00 1.00 0.00 1.00 2 pidstat 11:53:04 AM 0 24757 62.00 5.50 0.00 67.50 0 java 11:53:04 AM 0 24799 54.00 14.00 0.00 68.00 5 java 11:53:04 AM 0 24841 39.50 9.00 0.00 48.50 0 java 11:53:04 AM UID PID %usr %system %guest %CPU CPU Command 11:53:06 AM 0 16813 0.50 0.50 0.00 1.00 2 pidstat 11:53:06 AM 0 24757 80.00 13.50 0.00 93.50 0 java 11:53:06 AM 0 24799 56.50 0.50 0.00 57.00 5 java 11:53:06 AM 0 24841 1.00 0.50 0.00 1.50 0 java 11:53:06 AM UID PID %usr %system %guest %CPU CPU Command 11:53:08 AM 0 16813 0.00 0.50 0.00 0.50 2 pidstat 11:53:08 AM 0 24757 58.50 1.00 0.00 59.50 0 java 11:53:08 AM 0 24799 60.00 1.50 0.00 61.50 5 java 11:53:08 AM 0 24841 1.00 0.50 0.00 1.50 0 java Average: UID PID %usr %system %guest %CPU CPU Command Average: 0 16813 0.20 0.60 0.00 0.80 - pidstat Average: 0 24757 61.58 6.69 0.00 68.26 - java Average: 0 24799 66.47 5.19 0.00 71.66 - java Average: 0 24841 39.92 3.99 0.00 43.91 - java ``` --------------------------------------------------------------------- ## 内存监控 - Linux 的内存本质是虚拟内存，这样说是因为它的内存是：物理内存 + 交换分区。有一个内存模块来管理应用的内存使用。 - 如果所以你内存大，可以考虑把 swap 分区改得小点或者直接关掉。 - 但是，如果是用的云主机，一般是没交换分区的，`free -g` 中的 Swap 都是 0。 - 查看内存使用命令： - 以 M 为容量单位展示数据：`free -m` - 以 G 为容量单位展示数据：`free -g` - CentOS 6 和 CentOS 7 展示出来的数据有差别，CentOS 7 比较容易看，比如下面的数据格式是 CentOS 7 的 `free -g`： ``` total used free shared buff/cache available Mem: 11 0 10 0 0 10 Swap: 5 0 5 ``` - 在以上结果中，其中可以用的内存是看 `available` 列。 - 对于 CentOS 6 的系统可以使用下面命令： ``` [root@bogon ~]# free -mlt total used free shared buffers cached Mem: 16080 15919 160 0 278 11934 Low: 16080 15919 160 High: 0 0 0 -/+ buffers/cache: 3706 12373 Swap: 0 0 0 Total: 16080 15919 160 ``` - 以上的结果重点关注是：`-/+ buffers/cache`，这一行代表实际使用情况。 ##### pidstat 采样内存使用情况 - 安装：`yum install -y sysstat` - 每隔 2 秒采样一次，一共 3 次：`pidstat -r 2 3` ``` Linux 3.10.0-693.el7.x86_64 (youmeek) 07/17/2018 _x86_64_ (8 CPU) 11:56:34 AM UID PID minflt/s majflt/s VSZ RSS %MEM Command 11:56:36 AM 0 23960 168.81 0.00 108312 1124 0.01 pidstat 11:56:36 AM 0 24757 8.42 0.00 9360696 3862788 23.75 java 11:56:36 AM 0 24799 8.91 0.00 10424088 4988468 30.67 java 11:56:36 AM 0 24841 11.39 0.00 10423576 4968428 30.54 java 11:56:36 AM UID PID minflt/s majflt/s VSZ RSS %MEM Command 11:56:38 AM 0 23960 169.50 0.00 108312 1200 0.01 pidstat 11:56:38 AM 0 24757 6.00 0.00 9360696 3862788 23.75 java 11:56:38 AM 0 24799 5.50 0.00 10424088 4988468 30.67 java 11:56:38 AM 0 24841 7.00 0.00 10423576 4968428 30.54 java 11:56:38 AM UID PID minflt/s majflt/s VSZ RSS %MEM Command 11:56:40 AM 0 23960 160.00 0.00 108312 1200 0.01 pidstat 11:56:40 AM 0 24757 6.50 0.00 9360696 3862788 23.75 java 11:56:40 AM 0 24799 6.00 0.00 10424088 4988468 30.67 java 11:56:40 AM 0 24841 8.00 0.00 10423576 4968428 30.54 java Average: UID PID minflt/s majflt/s VSZ RSS %MEM Command Average: 0 23960 166.11 0.00 108312 1175 0.01 pidstat Average: 0 24757 6.98 0.00 9360696 3862788 23.75 java Average: 0 24799 6.81 0.00 10424088 4988468 30.67 java Average: 0 24841 8.80 0.00 10423576 4968428 30.54 java ``` --------------------------------------------------------------------- ## 硬盘监控 #### 硬盘容量相关查看 - `df -h`：自动以合适的磁盘容量单位查看磁盘大小和使用空间 - `df -m`：以磁盘容量单位 M 为数值结果查看磁盘使用情况 - `du -sh /opt/tomcat6`：查看tomcat6这个文件夹大小 (h的意思human-readable用人类可读性较好方式显示，系统会自动调节单位，显示合适大小的单位) - `du /opt --max-depth=1 -h`：查看指定录入下包括子目录的各个文件大小情况 #### 命令：iostat（判断 I/0 瓶颈） - 命令：`iostat -x -k 3 3`，每 3 秒采样一次，共 3 次。 ``` avg-cpu: %user %nice %system %iowait %steal %idle 0.55 0.00 0.52 0.00 0.00 98.93 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.00 0.04 0.02 0.62 0.44 6.49 21.65 0.00 1.42 1.17 1.42 0.25 0.02 avg-cpu: %user %nice %system %iowait %steal %idle 0.34 0.00 0.00 0.00 0.00 99.66 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.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 avg-cpu: %user %nice %system %iowait %steal %idle 2.02 0.00 0.34 0.00 0.00 97.64 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.00 0.00 0.00 1.68 0.00 16.16 19.20 0.00 0.20 0.00 0.20 0.20 0.03 ``` - 列说明： - `rrqm/s`: 每秒对该设备的读请求被合并次数，文件系统会对读取同块(block)的请求进行合并 - `wrqm/s`: 每秒对该设备的写请求被合并次数 - `r/s`: 每秒完成的读次数 - `w/s`: 每秒完成的写次数 - `rkB/s`: 每秒读数据量(kB为单位) - `wkB/s`: 每秒写数据量(kB为单位) - `avgrq-sz`:平均每次IO操作的数据量(扇区数为单位) - `avgqu-sz`: 平均等待处理的IO请求队列长度（队列长度大于 1 表示设备处于饱和状态。） - `await`: 系统发往 IO 设备的请求的平均响应时间(毫秒为单位)。这包括请求排队的时间，以及请求处理的时间。超过经验值的平均响应时间表明设备处于饱和状态，或者设备有问题。 - `svctm`: 平均每次IO请求的处理时间(毫秒为单位) - `%util`: 采用周期内用于IO操作的时间比率，即IO队列非空的时间比率（就是繁忙程度，值越高表示越繁忙） - **总结** - `iowait%` 表示CPU等待IO时间占整个CPU周期的百分比，如果iowait值超过50%，或者明显大于%system、%user以及%idle，表示IO可能存在问题。 - `%util` （重点参数）表示磁盘忙碌情况，一般该值超过80%表示该磁盘可能处于繁忙状态 #### 硬盘 IO 监控 - 安装 iotop：`yum install -y iotop` - 查看所有进程 I/O 情况命令：`iotop` - 只查看当前正在处理 I/O 的进程：`iotop -o` - 只查看当前正在处理 I/O 的线程，每隔 5 秒刷新一次：`iotop -o -d 5` - 只查看当前正在处理 I/O 的进程（-P 参数决定），每隔 5 秒刷新一次：`iotop -o -P -d 5` - 只查看当前正在处理 I/O 的进程（-P 参数决定），每隔 5 秒刷新一次，使用 KB/s 单位（默认是 B/s）：`iotop -o -P -k -d 5` - 使用 dd 命令测量服务器延迟：`dd if=/dev/zero of=/opt/ioTest2.txt bs=512 count=1000 oflag=dsync` - 使用 dd 命令来测量服务器的吞吐率（写速度)：`dd if=/dev/zero of=/opt/ioTest1.txt bs=1G count=1 oflag=dsync` - 该命令创建了一个 10M 大小的文件 ioTest1.txt，其中参数解释： - if 代表输入文件。如果不指定 if，默认就会从 stdin 中读取输入。 - of 代表输出文件。如果不指定 of，默认就会将 stdout 作为默认输出。 - bs 代表字节为单位的块大小。 - count 代表被复制的块数。 - /dev/zero 是一个字符设备，会不断返回0值字节（\0）。 - oflag=dsync：使用同步I/O。不要省略这个选项。这个选项能够帮助你去除 caching 的影响，以便呈现给你精准的结果。 - conv=fdatasyn: 这个选项和 oflag=dsync 含义一样。 - 该命令执行完成后展示的数据： ``` [root@youmeek ~]# dd if=/dev/zero of=/opt/ioTest1.txt bs=1G count=1 oflag=dsync 记录了1+0 的读入 记录了1+0 的写出 1073741824字节(1.1 GB)已复制，5.43328 秒，198 MB/秒 ``` - 利用 hdparm 测试硬盘速度：`yum install -y hdparm` - 查看硬盘分区情况：`df -h`，然后根据分区测试： - 测试硬盘分区的读取速度：`hdparm -T /dev/sda` - 测试硬盘分区缓存的读取速度：`hdparm -t /dev/sda` - 也可以以上两个参数一起测试：`hdparm -Tt /dev/sda`，结果数据如下： ``` /dev/sda: Timing cached reads: 3462 MB in 2.00 seconds = 1731.24 MB/sec Timing buffered disk reads: 806 MB in 3.00 seconds = 268.52 MB/sec ``` ##### pidstat 采样硬盘使用情况 - 安装：`yum install -y sysstat` - 每隔 2 秒采样一次，一共 3 次：`pidstat -d 2 3` ``` Linux 3.10.0-693.el7.x86_64 (youmeek) 07/17/2018 _x86_64_ (8 CPU) 11:57:29 AM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command 11:57:31 AM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command 11:57:33 AM 0 24757 0.00 2.00 0.00 java 11:57:33 AM 0 24799 0.00 14.00 0.00 java 11:57:33 AM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command 11:57:35 AM 0 24841 0.00 8.00 0.00 java Average: UID PID kB_rd/s kB_wr/s kB_ccwr/s Command Average: 0 24757 0.00 0.66 0.00 java Average: 0 24799 0.00 4.65 0.00 java Average: 0 24841 0.00 2.66 0.00 java ``` - 输出指标含义： ``` kB_rd/s: 每秒进程从磁盘读取的数据量(以 kB 为单位) kB_wr/s: 每秒进程向磁盘写的数据量(以 kB 为单位) kB_ccwr/s：任务取消的写入磁盘的 KB。当任务截断脏的 pagecache 的时候会发生。 ``` --------------------------------------------------------------------- ## 网络监控 #### 网络监控常用 - 安装 iftop（需要有 EPEL 源）：`yum install -y iftop` - 如果没有 EPEL 源：`yum install -y epel-release` - 常用命令： - `iftop`：默认是监控第一块网卡的流量 - `iftop -i eth0`：监控 eth0 - `iftop -n`：直接显示IP, 不进行DNS反解析 - `iftop -N`：直接显示连接埠编号, 不显示服务名称 - `iftop -F 192.168.1.0/24 or 192.168.1.0/255.255.255.0`：显示某个网段进出封包流量 - `iftop -nP`：显示端口与 IP 信息 ``` nginx 中间部分：外部连接列表，即记录了哪些ip正在和本机的网络连接 右边部分：实时参数分别是该访问 ip 连接到本机 2 秒，10 秒和 40 秒的平均流量 => 代表发送数据，116.196.110.69:aicc-cmi (ESTABLISHED) java 12011 root 78u IPv6 4506843 0t0 TCP JDu4e00u53f7:58576->116.196.110.69:aicc-cmi (ESTABLISHED) java 12011 root 79u IPv6 4506844 0t0 TCP JDu4e00u53f7:58578->116.196.110.69:aicc-cmi (ESTABLISHED) java 12011 root 80u IPv6 4506845 0t0 TCP JDu4e00u53f7:58574->116.196.110.69:aicc-cmi (ESTABLISHED) java 12011 root 82u IPv6 4506846 0t0 TCP JDu4e00u53f7:58562->116.196.110.69:aicc-cmi (ESTABLISHED) java 12011 root 83u IPv6 4506847 0t0 TCP JDu4e00u53f7:58564->116.196.110.69:aicc-cmi (ESTABLISHED) java 12011 root 84u IPv6 4506848 0t0 TCP JDu4e00u53f7:58566->116.196.110.69:aicc-cmi (ESTABLISHED) java 12011 root 85u IPv6 4506849 0t0 TCP JDu4e00u53f7:58568->116.196.110.69:aicc-cmi (ESTABLISHED) java 12011 root 86u IPv6 4506850 0t0 TCP JDu4e00u53f7:58570->116.196.110.69:aicc-cmi (ESTABLISHED) java 12011 root 87u IPv6 4506851 0t0 TCP JDu4e00u53f7:58572->116.196.110.69:aicc-cmi (ESTABLISHED) docker-pr 13551 root 4u IPv6 2116824 0t0 TCP *:aicc-cmi (LISTEN) ``` #### netstat - 更多用法可以看：[netstat 的10个基本用法](https://linux.cn/article-2434-1.html) - 查看所有在用的端口（macOS 也适用）：`netstat -ntlp` ``` Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 746/sshd tcp 0 0 127.0.0.1:32000 0.0.0.0:* LISTEN 12011/java tcp6 0 0 :::9066 :::* LISTEN 12011/java tcp6 0 0 :::6379 :::* LISTEN 28668/docker-proxy tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::3316 :::* LISTEN 13551/docker-proxy tcp6 0 0 :::22 :::* LISTEN 746/sshd tcp6 0 0 :::35224 :::* LISTEN 12011/java tcp6 0 0 :::3326 :::* LISTEN 14203/docker-proxy tcp6 0 0 :::1984 :::* LISTEN 12011/java tcp6 0 0 :::8066 :::* LISTEN 12011/java tcp6 0 0 :::43107 :::* LISTEN 12011/java ``` - 查看当前连接80端口的机子有多少，并且是属于什么状态：`netstat -an|grep 80|sort -r` - 查看已经连接的IP有多少连接数：`netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n` - 查看已经连接的IP有多少连接数，只显示前 5 个：`netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n | head -5` - 查看每个 ip 跟服务器建立的连接数：`netstat -nat|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn` ``` 262 127.0.0.1 118 103 172.22.100.141 12 172.22.100.29 7 172.22.100.183 6 116.21.17.144 6 0.0.0.0 5 192.168.1.109 4 172.22.100.32 4 172.22.100.121 4 172.22.100.108 4 172.18.1.39 3 172.22.100.2 3 172.22.100.190 ``` - 统计当前连接的一些状态情况：`netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'` 或者 `netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn` ``` TIME_WAIT 96（是表示系统在等待客户端响应，以便再次连接时候能快速响应，如果积压很多，要开始注意了，准备阻塞了。这篇文章可以看下：http://blog.51cto.com/jschu/1728001） CLOSE_WAIT 11（如果积压很多，要开始注意了，准备阻塞了。可以看这篇文章：http://blog.51cto.com/net881004/2164020） FIN_WAIT2 17 ESTABLISHED 102（表示正常数据传输状态） ``` - TIME_WAIT 和 CLOSE_WAIT 说明： ``` Linux 系统下，TCP连接断开后，会以TIME_WAIT状态保留一定的时间，然后才会释放端口。当并发请求过多的时候，就会产生大量的TIME_WAIT状态 的连接，无法及时断开的话，会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数，来及时将TIME_WAIT状态的端口清理掉。 来源：http://zhangbin.junxilinux.com/?p=219 ================================= 出现大量close_wait的现象，主要原因是某种情况下对方关闭了socket链接，但是另一端由于正在读写，没有关闭连接。代码需要判断socket，一旦读到0，断开连接，read返回负，检查一下errno，如果不是AGAIN，就断开连接。 Linux分配给一个用户的文件句柄是有限的，而TIME_WAIT和CLOSE_WAIT两种状态如果一直被保持，那么意味着对应数目的通道就一直被占着，一旦达到句柄数上限，新的请求就无法被处理了，接着就是大量Too Many Open Files异常，导致tomcat崩溃。关于TIME_WAIT过多的解决方案参见TIME_WAIT数量太多。 常见错误原因： 1.代码层面上未对连接进行关闭，比如关闭代码未写在 finally 块关闭，如果程序中发生异常就会跳过关闭代码，自然未发出指令关闭，连接一直由程序托管，内核也无权处理，自然不会发出 FIN 请求，导致连接一直在 CLOSE_WAIT 。 2.程序响应过慢，比如双方进行通讯，当客户端请求服务端迟迟得不到响应，就断开连接，重新发起请求，导致服务端一直忙于业务处理，没空去关闭连接。这种情况也会导致这个问题。一般如果有多个节点，nginx 进行负载，其中某个节点很高，其他节点不高，那可能就是负载算法不正常，都落在一台机子上了，以至于它忙不过来。 来源：https://juejin.im/post/5b59e61ae51d4519634fe257 ``` - 查看网络接口接受、发送的数据包情况（每隔 3 秒统计一次）：`netstat -i 3` ``` Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 10903298 0 0 0 10847741 0 0 0 BMRU lo 65536 453650 0 0 0 453650 0 0 0 LRU eth0 1500 10903335 0 0 0 10847777 0 0 0 BMRU lo 65536 453650 0 0 0 453650 0 0 0 LRU eth0 1500 10903363 0 0 0 10847798 0 0 0 BMRU lo 65536 453650 0 0 0 453650 0 0 0 LRU eth0 1500 10903393 0 0 0 10847836 0 0 0 BMRU lo 65536 453650 0 0 0 453650 0 0 0 LRU eth0 1500 10903437 0 0 0 10847867 0 0 0 BMRU lo 65536 453650 0 0 0 453650 0 0 0 LRU ``` - 接收（该值是历史累加数据，不是瞬间数据，要计算时间内的差值需要自己减）： - RX-OK 已接收字节数 - RX-ERR 已接收错误字节数（数据值大说明网络存在问题） - RX-DRP 已丢失字节数（数据值大说明网络存在问题） - RX-OVR 由于误差而遗失字节数（数据值大说明网络存在问题） - 发送（该值是历史累加数据，不是瞬间数据，要计算时间内的差值需要自己减）： - TX-OK 已发送字节数 - TX-ERR 已发送错误字节数（数据值大说明网络存在问题） - TX-DRP 已丢失字节数（数据值大说明网络存在问题） - TX-OVR 由于误差而遗失字节数（数据值大说明网络存在问题） #### 网络排查 - ping 命令查看丢包、域名解析地址 - `ping 116.196.110.69` - `ping www.GitNavi.com` - telnet 测试端口的连通性（验证服务的可用性） - `yum install -y telnet` - `telnet 116.196.110.68 3306` - `telnet www.youmeek.com 80` - tracert（跟踪路由）查看网络请求节点访问情况，用于确定 IP 数据报访问目标所采取的路径。 - `yum install -y traceroute` - `traceroute gitnavi.com` - nslookup 命令查看 DNS 是否可用 - `yum install -y bind-utils` - 输入：`nslookup`，然后终端进入交互模式，然后输入：`www.baidu.com`，此时会展示类似这样的信息： ``` Server: 103.224.222.221（这个是你本机的信息） Address: 103.224.222.221#53（这个是你本机的信息） （下面是百度的信息） Non-authoritative answer: www.baidu.COM canonical name = www.a.shifen.COM. Name: www.a.shifen.COM Address: 220.181.112.244 Name: www.a.shifen.COM Address: 220.181.111.188 ``` - 此时我们假设换个 DNS，我们在刚刚的交互阶段继续输入：`server 8.8.8.8`，表示我们此时用 8.8.8.8 的 DNS，然后我们在交互中再输入：`www.baidu.com`，此时会出现这个信息： ``` Server: 8.8.8.8 Address: 8.8.8.8#53 Non-authoritative answer: www.baidu.com canonical name = www.a.shifen.com. Name: www.a.shifen.com Address: 180.97.33.108 Name: www.a.shifen.com Address: 180.97.33.107 ``` - 以上表明，不同的 DNS 情况下，我们获取到的域名所属 IP 是不同的。 --------------------------------------------------------------------- ## 查看 Linux 内核版本 - 对于一些复杂的层面问题，一般都要先确认内核版本，好帮助分析：`uname -r` ``` 3.10.0-693.2.2.el7.x86_64 ``` ## dmesg 打印内核信息 - 开机信息存在：`tail -500f /var/log/dmesg` - 查看尾部信息：`dmesg -T | tail` - 参数 `-T` 表示显示时间 - 只显示 error 和 warning 信息：`dmesg --level=err,warn -T` - 有些 OOM 的错误会在这里显示，比如： ``` [1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child [1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB ``` ## 查看系统日志 - 查看系统日志：`tail -400f /var/log/messages` - 可能会看到类似以下异常： ``` Out of memory: Kill process 19452 (java) score 264 or sacrifice child ``` --------------------------------------------------------------------- ## 服务器故障排查顺序 #### 请求时好时坏 - 系统层面 - 查看负载、CPU、内存、上线时间、高资源进程 PID：`htop` - 查看网络丢失情况：`netstat -i 3`，关注：RX-DRP、TX-DRP，如果两个任何一个有值，或者都有值，肯定是网络出了问题（该值是历史累加数据，不是瞬间数据）。 - 应用层面 - 临时修改 nginx log 输出格式，输出完整信息，包括请求头 ``` $request_body 请求体（含POST数据） $http_XXX 指定某个请求头（XXX为字段名，全小写） $cookie_XXX 指定某个cookie值（XXX为字段名，全小写） 类似用法： log_format special_main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$request_body" "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for "appid=$http_appid,appver=$http_appver,vuser=$http_vuser" ' '"phpsessid=$cookie_phpsessid,vuser_cookie=$cookie___vuser" '; access_log /home/wwwlogs/hicrew.log special_main; ``` #### CPU 高，负载高，访问慢（没有数据库） - **记录负载开始升高的时间** - 常见场景 - 虚拟机所在的宿主机资源瓶颈，多个虚拟机竞争资源 - 定时任务大量的任务并发 - 消息、请求堆积后恢复时的瞬时流量引起 - 持久化任务引起 - 更多可以看这篇：[线上异常排查总结](https://blog.csdn.net/freeiceflame/article/details/78006812) - 系统层面 - 查看负载、CPU、内存、上线时间、高资源进程 PID：`htop` - 查看磁盘使用情况：`df -h` - 查看磁盘当前情况：`iostat -x -k 3 3`。如果发现当前磁盘忙碌，则查看是哪个 PID 在忙碌：`iotop -o -P -k -d 5` - 查看 PID 具体在写什么东西：`lsof -p PID` - 查看系统日志：`tail -400f /var/log/messages` - 查看简化线程树：`pstree -a >> /opt/pstree-20180915.log` - 其他机子 ping（多个地区 ping），看下解析 IP 与网络丢包 - 查看网络节点情况：`traceroute www.youmeek.com` - `ifconfig` 查看 dropped 和 error 是否在不断增加，判断网卡是否出现问题 - `nslookup` 命令查看 DNS 是否可用 - 如果 nginx 有安装：http_stub_status_module 模块，则查看当前统计 - 查看 TCP 和 UDP 应用 - `netstat -ntlp` - `netstat -nulp` - 统计当前连接的一些状态情况：`netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn` - 查看每个 ip 跟服务器建立的连接数：`netstat -nat|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn` - 查看与后端应用端口连接的有多少：`lsof -i:8080|grep 'TCP'|wc -l` - 跟踪程序（按 `Ctrl + C` 停止跟踪）：`strace -tt -T -v -f -e trace=file -o /opt/strace-20180915.log -s 1024 -p PID` - 看下谁在线：`w`，`last` - 看下执行了哪些命令：`history` - 程序、JVM 层面 - 保存、查看 Nginx 程序 log - 通过 GoAccess 分析 log - 保存、查看 Java 程序 log - 使用内置 tomcat-manager 监控配置，或者使用类似工具：psi-probe - 使用 `ps -ef | grep java`，查看进程 PID - 根据高 CPU 的进程 PID，查看其线程 CPU 使用情况：`top -Hp PID`，找到占用 CPU 资源高的线程 PID - 保存堆栈情况：`jstack -l PID >> /opt/jstack-tomcat1-PID-20180917.log` - 把占用 CPU 资源高的线程十进制的 PID 转换成 16 进制：`printf "%x\n" PID`，比如：`printf "%x\n" 12401` 得到结果是：`3071` - 在刚刚输出的那个 log 文件中搜索：`3071`，可以找到：`nid=0x3071` - 使用 `jstat -gc PID 10000 10`，查看gc情况（截图） - 使用 `jstat -gccause PID`：额外输出上次GC原因（截图） - 使用 `jstat -gccause PID 10000 10`：额外输出上次GC原因，收集 10 次，每隔 10 秒 - 使用 `jmap -dump:format=b,file=/opt/dumpfile-tomcat1-PID-20180917.hprof PID`，生成堆转储文件 - 使用 jhat 或者可视化工具（Eclipse Memory Analyzer 、IBM HeapAnalyzer）分析堆情况。 - 结合代码解决内存溢出或泄露问题。 - 给 VM 增加 dump 触发参数：`-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat-1.hprof` #### 一次 JVM 引起的 CPU 高排查 - 使用 `ps -ef | grep java`，查看进程 PID - 根据高 CPU 的进程 PID，查看其线程 CPU 使用情况：`top -Hp PID`，找到占用 CPU 资源高的线程 TID - 也可以用：`ps -mp PID -o THREAD,tid,time` - 保存堆栈情况：`jstack -l TID >> /opt/jstack-tomcat1-TID-20181017.log` - 把占用 CPU 资源高的线程十进制的 TID 转换成 16 进制：`printf "%x\n" TID`，比如：`printf "%x\n" 12401` 得到结果是：`3071` - 在刚刚输出的那个 log 文件中搜索：`3071`，可以找到：`nid=0x3071` - 也可以在终端中直接看：`jstack TID |grep 十六进制线程 -A 30`，此时如果发现如下： ``` "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007fd0ac01f000 nid=0x66f runnable ``` - 这种情况一般是 heap 设置得过小，而又要频繁分配对象；二是内存泄露，对象一直不能被回收，导致 CPU 占用过高 - 使用：`jstat -gcutil PID 3000 10`： - 正常情况结果应该是这样的： ``` S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 0.00 67.63 38.09 78.03 68.82 124 0.966 5 0.778 1.744 0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 0.00 0.00 67.71 38.09 78.03 68.82 124 0.966 5 0.778 1.744 0.00 0.00 67.71 38.09 78.03 68.82 124 0.966 5 0.778 1.744 ``` - S0：SO 当前使用比例 - S1：S1 当前使用比例 - E：**Eden 区使用比例（百分比）（异常的时候，这里可能会接近 100%）** - O：**old 区使用比例（百分比）（异常的时候，这里可能会接近 100%）** - M：**Metaspace 区使用比例（百分比）（异常的时候，这里可能会接近 100%）** - CCS：压缩使用比例 - YGC：年轻代垃圾回收次数 - FGC：老年代垃圾回收次数 - FGCT：老年代垃圾回收消耗时间（单位秒） - GCT：垃圾回收消耗总时间（单位秒） - **异常的时候每次 Full GC 时间也可能非常长，每次时间计算公式=FGCT值/FGC指）** - `jmap -heap PID`，查看具体占用量是多大 - 使用 `jmap -dump:format=b,file=/opt/dumpfile-tomcat1-PID-20180917.hprof PID`，生成堆转储文件（如果设置的 heap 过大，dump 下来会也会非常大） - 使用 jhat 或者可视化工具（Eclipse Memory Analyzer 、IBM HeapAnalyzer）分析堆情况。 - 一般这时候就只能根据 jhat 的分析，看源码了 - 这里有几篇类似经历的文章推荐给大家： - [三个神奇bug之Java占满CPU](http://luofei.me/?p=197) - [CPU 负载过高问题排查](http://zhouyun.me/2017/10/24/cpu_load_issue/) #### CPU 低，负载高，访问慢（带数据库） - 基于上面，但是侧重点在于 I/O 读写，以及是否有 MySQL 死锁，或者挂载了 NFS，而 NFS Server 出现问题 - mysql 下查看当前的连接数与执行的sql 语句：`show full processlist;` - 检查慢查询日志，可能是慢查询引起负载高，根据配置文件查看存放位置：`log_slow_queries` - 查看 MySQL 设置的最大连接数：`show variables like 'max_connections';` - 重新设置最大连接数：`set GLOBAL max_connections=300` ## 参考资料 - - - - - - - - - -
# NFS（Network FileSystem）介绍 ## NFS 安装 - 查看是否已安装： - CentOS：`rpm -qa | grep nfs-*` - Ubuntu：`dpkg -l | grep nfs-*` - 安装： - CentOS 5：`sudo yum install -y nfs-utils portmap` - CentOS 6：`sudo yum install -y nfs-utils rpcbind` - Ubuntu：`sudo apt-get install -y nfs-common nfs-kernel-server` ## NFS 服务器配置文件常用参数 - 配置文件介绍（记得先备份）：`sudo vim /etc/exports` - 默认配置文件里面是没啥内容的，我们需要自己加上配置内容，一行表示共享一个目录。为了方便使用，共享的目录最好将权限设置为 777（`chmod 777 folderName`）。 - 假设在配置文件里面加上：`/opt/mytest 192.168.0.0/55(rw,sync,all_squash,anonuid=501,anongid=501,no_subtree_check)` - 该配置解释： - /opt/mytest 表示我们要共享的目录 - 192.168.0.0/55 表示内网中这个网段区间的IP是可以进行访问的，如果要任意网段都可以访问，可以用 `*` 号表示 - (rw,sync,all_squash,anonuid=501,anongid=501,no_subtree_check) 表示权限 - rw：是可读写（ro是只读） - sync：同步模式，表示内存中的数据时时刻刻写入磁盘（async：非同步模式，内存中数据定期存入磁盘） - all_squash：表示不管使用NFS的用户是谁，其身份都会被限定为一个指定的普通用户身份。（no_root_squash：其他客户端主机的root用户对该目录有至高权限控制。root_squash：表示其他客户端主机的root用户对该目录有普通用户权限控制） - anonuid/anongid：要和root_squash或all_squash选项一同使用，表示指定使用NFS的用户被限定后的uid和gid，前提是本图片服务器的/etc/passwd中存在这一的uid和gid - no_subtree_check：不检查父目录的权限 - 启动服务： - `/etc/init.d/rpcbind restart` - `/etc/init.d/nfs-kernel-server restart` ## NFS 客户端访问 - 客户端要访问服务端的共享目录需要对其共享的目录进行挂载，在挂载之前先检查下：`showmount -e 192.168.1.25`（这个 IP 是 NFS 的服务器端 IP） - 如果显示：/opt/mytest 相关信息表示成功了。 - 现在开始对其进行挂载：`mount -t nfs 192.168.1.25:/opt/mytest/ /mytest/` - 在客户端机器上输入命令：`df -h` 可以看到多了一个 mytest 分区。然后我们可以再创建一个软链接，把软链接放在 war 包的目录下，这样上传的图片都会跑到另外一台服务器上了。软链接相关内容请自行搜索。 ## NFS 资料 - - - - -
# NFS服务器部署 NFS服务所需软件及主要配置文件： 安装NFS服务，需要安装两个软件，分别是： RPC主程序：rpcbind NFS 其实可以被视为一个 RPC 服务，因为启动任何一个 RPC 服务之前，我们都需要做好 port 的对应 (mapping) 的工作才行，这个工作其实就是『 rpcbind 』这个服务所负责的！也就是说， 在启动任何一 个 RPC 服务之前，我们都需要启动 rpcbind 才行！ (在 CentOS 5.x 以前这个软件称为 portmap，在 CentOS 6.x 之后才称为 rpcbind 的！)。 NFS主程序：nfs-utils 就是提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其他相关 documents 与说明文件、执行文 件等的软件！这个就是 NFS 服务所需要的主要软件。 NFS的相关文件： 主要配置文件：/etc/exports 这是 NFS 的主要配置文件了。该文件是空白的，有的系统可能不存在这个文件，主要手动建立。NFS的 配置一般只在这个文件中配置即可。 NFS 文件系统维护指令：/usr/sbin/exportfs 这个是维护 NFS 分享资源的指令，可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸除或重新分享。 分享资源的登录档：/var/lib/nfs/*tab 在 NFS 服务器的登录文件都放置到 /var/lib/nfs/ 目录里面，在该目录下有两个比较重要的登录档， 一个 是 etab ，主要记录了 NFS 所分享出来的目录的完整权限设定值；另一个 xtab 则记录曾经链接到此 NFS 服务器的相关客户端数据。 客户端查询服务器分享资源的指令：/usr/sbin/showmount 这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端，而 showmount 则主要用在 Client 端。 showmount 可以用来察看 NFS 分享出来的目录资源。 ## 服务器安装NFS服务步骤： ### 第一步：安装NFS和rpc ``` [root@localhost ~]# yum install rpcbind.x86_64 #安装rpc服务 [root@localhost ~]# yum install nfs-utils.x86_64 #安装nfs服务 ``` ### 第二步：启动服务和设置开启启动： 注意：先启动rpc服务，再启动nfs服务。 ``` [root@localhost ~]# systemctl restart rpcbind #先启动rpc服务 [root@localhost ~]# systemctl enable rpcbind #设置开机启动 [root@localhost ~]# systemctl restart nfs-server nfs-secure-server #启动nfs服务和nfs安全传输服务 [root@localhost ~]# systemctl enable nfs-server nfs-secure-server 以下步骤可以略去 [root@localhost /]# firewall-cmd --permanent --add-service=nfs success #配置防火墙放行nfs服务 [root@localhost /]# firewall-cmd --reload success ``` ### 第三步：配置共享文件目录，编辑配置文件： ``` 首先创建共享目录，然后在/etc/exports配置文件中编辑配置即可。 [root@localhost /]# mkdir /public #创建共享目录 [root@localhost /]# vim /etc/exports /public 192.168.245.0/24(ro) #/public为上面自定义的目录名 /protected 192.168.245.0/24（rw） [root@localhost /]# systemctl reload nfs #重新加载NFS服务，使配置文件生效 ``` 配置文件说明： 格式： 共享目录的路径 允许访问的NFS客户端（共享权限参数） 如上，共享目录为/public , 允许访问的客户端为192.168.245.0/24网络用户，权限为只读。 请注意，NFS客户端地址与权限之间没有空格。 NFS输出保护需要用到kerberos加密（none，sys，krb5，krb5i，krb5p），格式sec=XXX none：以匿名身份访问，如果要允许写操作，要映射到nfsnobody用户，同时布尔值开关要打开， setsebool nfsd_anon_write 1 sys：文件的访问是基于标准的文件访问，如果没有指定，默认就是sys， 信任任何发送过来用户名 krb5：客户端必须提供标识，客户端的表示也必须是krb5，基于域环境的认证 krb5i：在krb5的基础上做了加密的操作，对用户的密码做了加密，但是传输的数据没有加密 krb5p：所有的数据都加密 用于配置NFS服务程序配置文件的参数： 参数 作用 ro 只读 rw 读写 root_squash 当NFS客户端以root管理员访问时，映射为NFS服务器的匿名用户 no_root_squash 当NFS客户端以root管理员访问时，映射为NFS服务器的root管理员 all_squash 无论NFS客户端使用什么账户访问，均映射为NFS服务器的匿名用户 sync 同时将数据写入到内存与硬盘中，保证不丢失数据 async 优先将数据保存到内存，然后再写入硬盘；这样效率更高，但可能会丢失数据 ## NFS客户端挂载配置: ### **第一步: **使用showmount命令查看nfs服务器共享信息。输出格式为”共享的目录名称允许使用 客户端地址”。 ``` [root@localhost ~]# showmount -e 192.168.245.128 Export list for 192.168.245.128: /protected 192.168.245.0/24 /public 192.168.245.0/24 showmount命令的用法； 参数 作用 -e 显示NFS服务器的共享列表 -a 显示本机挂载的文件资源的情况NFS资源的情况 -v 显示版本号 ``` ### 第二步，在客户端创建目录，并挂载共享目录。 ``` [root@localhost ~]# mkdir /mnt/public [root@localhost ~]# mkdir /mnt/data [root@localhost ~]# vim /etc/fstab #在该文件中挂载，使系统每次启动时都能自动挂载 192.168.245.128:/public /mnt/public nfs defaults 0 0 192.168.245.128:/protected /mnt/data nfs defaults 0 1 [root@localhost ~]# mount -a #是文件/etc/fstab生效 ``` ### 第三步：检查 ``` [root@mail ~]# df -Th ``` 遇到以下错误提示,“clnt_create: RPC: Program not registered” , 解决方法: 服务端[root@localhost ~]# rpc.mountd showmount命令的用法; 参数 作用 显示NFS服务器的共享列表 iptab -F
# NFS服务器部署 NFS服务所需软件及主要配置文件： 安装NFS服务，需要安装两个软件，分别是： RPC主程序：rpcbind NFS 其实可以被视为一个 RPC 服务，因为启动任何一个 RPC 服务之前，我们都需要做好 port 的对应 (mapping) 的工作才行，这个工作其实就是『 rpcbind 』这个服务所负责的！也就是说， 在启动任何一 个 RPC 服务之前，我们都需要启动 rpcbind 才行！ (在 CentOS 5.x 以前这个软件称为 portmap，在 CentOS 6.x 之后才称为 rpcbind 的！)。 NFS主程序：nfs-utils 就是提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其他相关 documents 与说明文件、执行文 件等的软件！这个就是 NFS 服务所需要的主要软件。 NFS的相关文件： 主要配置文件：/etc/exports 这是 NFS 的主要配置文件了。该文件是空白的，有的系统可能不存在这个文件，主要手动建立。NFS的 配置一般只在这个文件中配置即可。 NFS 文件系统维护指令：/usr/sbin/exportfs 这个是维护 NFS 分享资源的指令，可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸除或重新分享。 分享资源的登录档：/var/lib/nfs/*tab 在 NFS 服务器的登录文件都放置到 /var/lib/nfs/ 目录里面，在该目录下有两个比较重要的登录档， 一个 是 etab ，主要记录了 NFS 所分享出来的目录的完整权限设定值；另一个 xtab 则记录曾经链接到此 NFS 服务器的相关客户端数据。 客户端查询服务器分享资源的指令：/usr/sbin/showmount 这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端，而 showmount 则主要用在 Client 端。 showmount 可以用来察看 NFS 分享出来的目录资源。 ## 服务器安装NFS服务步骤： ### 第一步：安装NFS和rpc ``` [root@localhost ~]# yum install rpcbind.x86_64 #安装rpc服务 [root@localhost ~]# yum install nfs-utils.x86_64 #安装nfs服务 ``` ### 第二步：启动服务和设置开启启动： 注意：先启动rpc服务，再启动nfs服务。 ``` [root@localhost ~]# systemctl restart rpcbind #先启动rpc服务 [root@localhost ~]# systemctl enable rpcbind #设置开机启动 [root@localhost ~]# systemctl restart nfs-server nfs-secure-server #启动nfs服务和nfs安全传输服务 [root@localhost ~]# systemctl enable nfs-server nfs-secure-server [root@localhost /]# firewall-cmd --permanent --add-service=nfs success #配置防火墙放行nfs服务 [root@localhost /]# firewall-cmd --reload success ``` ### 第三步：配置共享文件目录，编辑配置文件： ``` 首先创建共享目录，然后在/etc/exports配置文件中编辑配置即可。 [root@localhost /]# mkdir /public #创建共享目录 [root@localhost /]# vim /etc/exports /public 192.168.245.0/24(ro) #/public为上面自定义的目录名 /protected 192.168.245.0/24（rw） [root@localhost /]# systemctl reload nfs #重新加载NFS服务，使配置文件生效 ``` 配置文件说明： 格式： 共享目录的路径 允许访问的NFS客户端（共享权限参数） 如上，共享目录为/public , 允许访问的客户端为192.168.245.0/24网络用户，权限为只读。 请注意，NFS客户端地址与权限之间没有空格。 NFS输出保护需要用到kerberos加密（none，sys，krb5，krb5i，krb5p），格式sec=XXX none：以匿名身份访问，如果要允许写操作，要映射到nfsnobody用户，同时布尔值开关要打开， setsebool nfsd_anon_write 1 sys：文件的访问是基于标准的文件访问，如果没有指定，默认就是sys， 信任任何发送过来用户名 krb5：客户端必须提供标识，客户端的表示也必须是krb5，基于域环境的认证 krb5i：在krb5的基础上做了加密的操作，对用户的密码做了加密，但是传输的数据没有加密 krb5p：所有的数据都加密 用于配置NFS服务程序配置文件的参数： 参数 作用 ro 只读 rw 读写 root_squash 当NFS客户端以root管理员访问时，映射为NFS服务器的匿名用户 no_root_squash 当NFS客户端以root管理员访问时，映射为NFS服务器的root管理员 all_squash 无论NFS客户端使用什么账户访问，均映射为NFS服务器的匿名用户 sync 同时将数据写入到内存与硬盘中，保证不丢失数据 async 优先将数据保存到内存，然后再写入硬盘；这样效率更高，但可能会丢失数据 ## NFS客户端挂载配置: ### **第一步: **使用showmount命令查看nfs服务器共享信息。输出格式为”共享的目录名称允许使用 客户端地址”。 ``` [root@localhost ~]# showmount -e 192.168.245.128 Export list for 192.168.245.128: /protected 192.168.245.0/24 /public 192.168.245.0/24 showmount命令的用法； 参数 作用 -e 显示NFS服务器的共享列表 -a 显示本机挂载的文件资源的情况NFS资源的情况 -v 显示版本号 ``` ### 第二步，在客户端创建目录，并挂载共享目录。 ``` [root@localhost ~]# mkdir /mnt/public [root@localhost ~]# mkdir /mnt/data [root@localhost ~]# vim /etc/fstab #在该文件中挂载，使系统每次启动时都能自动挂载 192.168.245.128:/public /mnt/public nfs defaults 0 0 192.168.245.128:/protected /mnt/data nfs defaults 0 1 [root@localhost ~]# mount -a #是文件/etc/fstab生效 ``` ### 第三步：检查 ``` [root@mail ~]# df -Th ``` 遇到以下错误提示,“clnt_create: RPC: Program not registered” , 解决方法: 服务端[root@localhost ~]# rpc.mountd showmount命令的用法; 参数 作用 显示NFS服务器的共享列表 iptab -F
环境 服务端 192.168.10.1 客户端 192.168.10.2 ``` 服务端 yum install rpcbind.x86_64 yum install nfs-utils.x86_64 mkdir /data/share #创建共享目录 vim /etc/exports #编辑配置文件 /data/share 192.168.10.1/24(rw) 配置文件参数 ro #只读 rw #读写 root_squash #当 NFS 客户端以 root 管理员访问时，映射为 NFS 服务器的匿名用户 no_root_squash #当 NFS 客户端以 root 管理员访问时，映射为 NFS 服务器的 root 管理员 all_squash #无论 NFS 客户端使用什么账户访问，均映射为 NFS 服务器的匿名用户 sync #同时将数据写入到内存与硬盘中，保证不丢失数据 async #优先将数据保存到内存，然后再写入硬盘；这样效率更高，但可能会丢失数据 ``` ``` showmount -e 192.168.10.1 #查看挂载 参数 -e 显示 NFS 服务器的共享列表 -a 显示本机挂载的文件资源的情况 -v 显示版本号 ``` ``` 客户端 yum install nfs-utils showmount -e 192.168.10.1 mkdir /1 #创建挂载目录 mount -t nfs 192.168.10.1:/data/share /1 #将共享目录挂载到/1文件夹里 df -h #查看挂载 ```
# NFS ## 1.基本概念 ``` 网络文件系统--NFS是网络附加储存的一种，其功能允许客户端主机可以像访问本地存储一样通过网络访问服务器端文件。 主要用在 Linux和LInux系统之间提供共享存储。 ``` ## 2.操作实例 ### 2.1 安装和配置基本的NFS共享目录 #### server ``` 第一步：apt install nfs-kernel-server #安装服务 第二步：systemctl status nfs-server #查看服务状态信息 第三步：mkdir -p /nfs/yu #创建文件夹 第四步：echo "hello yu" >> /nfs/yu/1.txt #输入内容 第五步：vim /etc/exports #打开配置文件 /nfs/yu *(ro,no_subtree_check) 第六步：exportfs -av #使配置文件生效 ``` #### client ``` 第一步：apt install nfs-common #安装客户端测试 第二步：showmount -e 192.168.10.1 #查看此IP是否提供nfs挂载路径 第三步：mkdir /kk #创建文件夹 第四步：mount -t nfs 192.168.10.1:/nfs/yu /kk #将nfs挂载在/kk目录下 第五步：df -lh #查看挂载状态 第六步：mount | grep /kk #查看详细挂载信息 第七步：cd /kk #进入路径 第八步：touch 2.txt #尝试创建文件 touch: cannot touch '2.txt': Read-only file system ``` ### 2.2 配置NFS共享支持可读写的目录 #### server ``` 第一步：apt install nfs-kernel-server #安装服务 第二步：systemctl status nfs-server #查看服务状态信息 第三步：mkdir -p /nfs/yu #创建文件夹 第四步：echo "hello yu" >> /nfs/yu/1.txt #输入内容 第五步：chmod 777 /nfs/yu #赋予权限 第六步：vim /etc/exports #打开配置文件 /nfs/yu *(rw,sync,no_subtree_check) 第七步：exportfs -av #使配置文件生效 ``` #### client ``` 第一步：apt install nfs-common #安装客户端测试 第二步：showmount -e 192.168.10.1 #查看此IP是否提供nfs挂载路径 第三步：mkdir /kk #创建文件夹 第四步：mount -t nfs 192.168.10.1:/nfs/yu /kk #将nfs挂载在/kk目录下 第五步：df -lh #查看挂载状态 第六步：mount | grep /kk #查看详细挂载信息 第七步：cd /kk #进入路径 第八步：touch 2.txt #创建文件 第九步：ls -lh #查看创建的文件 ``` ### 2.3 NFS客户端和服务器端的用户映射 #### client ```` 第一步：su - demo #切换用户为demo用户 第二步：cd /kk #进入路径 第三步：touch demo.txt #创建文件 第四步：ls -lh #查看拥有者和所属组 -rw-r--r-- 1 demo demo 0 Sep 11 12:48 demo.txt 第五步：exit #退出用户 第六步：cd /kk #进入路径 第七步：touch root.txt #创建文件 第八步：ls -lh #查看拥有者和所属组 -rw-r--r-- 1 nobody nogroup 0 Sep 11 12:52 root.txt 当你以普通用户创建文件时， 它对应的拥有者和所属组都是你自己 当你以root用户创建文件时，它对应的是nobody nogroup ```` ### 2.4 取消nfs对于root用户的匿名映射 #### server ``` 第一步：apt install nfs-kernel-server #安装服务 第二步：systemctl status nfs-server #查看服务状态信息 第三步：mkdir -p /nfs/yu #创建文件夹 第四步：echo "hello yu" >> /nfs/yu/1.txt #输入内容 第五步：chmod 777 /nfs/yu #赋予权限 第六步：vim /etc/exports #打开配置文件 /nfs/yu *(rw,sync,no_subtree_check,no_root_squash) 第七步：exportfs -av #使配置文件生效 ``` #### client ``` 第一步：apt install nfs-common #安装客户端测试 第二步：showmount -e 192.168.10.1 #查看此IP是否提供nfs挂载路径 第三步：mkdir /kk #创建文件夹 第四步：mount -t nfs 192.168.10.1:/nfs/yu /kk #将nfs挂载在/kk目录下 第五步：df -lh #查看挂载状态 第六步：mount | grep /kk #查看详细挂载信息 第七步：cd /kk #进入路径 第八步：touch root.txt.1 #创建文件 第九步：ls -lh #查看创建的文件 -rw-r--r-- 1 nobody nogroup 0 Sep 11 12:52 root.txt 对比拥有者和所属组的区别 -rw-r--r-- 1 root root 0 Sep 11 13:13 root.txt.1 ``` ### 2.5 配置，将所有用户都映射为某个指定的用户 #### server ``` 第一步：apt install nfs-kernel-server #安装服务 第二步：systemctl status nfs-server #查看服务状态信息 第三步：mkdir -p /nfs/yu #创建文件夹 第四步：echo "hello yu" >> /nfs/yu/1.txt #输入内容 第五步：chmod 777 /nfs/yu #赋予权限 第六步：vim /etc/exports #打开配置文件 /nfs/yu *(rw,sync,no_subtree_check,all_squash,anonuid=1002,anongid=1002) 第七步：exportfs -av #使配置文件生效 ``` #### client ``` 第一步：apt install nfs-common #安装客户端测试 第二步：showmount -e 192.168.10.1 #查看此IP是否提供nfs挂载路径 第三步：mkdir /kk #创建文件夹 第四步：mount -t nfs 192.168.10.1:/nfs/yu /kk #将nfs挂载在/kk目录下 第五步：df -lh #查看挂载状态 第六步：mount | grep /kk #查看详细挂载信息 第七步：cd /kk #进入路径 第八步：touch 1.txt #创建文件 第九步：ls -lh #查看创建的文件 -rw-r--r-- 1 1002 1002 0 Sep 11 12:46 1.txt ``` ### 2.6 自动挂载 #### client ``` 第一步：vim /etc/fstab #打开配置文件 192.168.10.1:/nfs/yu /kk nfs4 defaults 0 0 第二步：mount -a #重新识挂载文件 ``` #### 技能实践 ``` 1.自动挂载还有哪些方法 2.NFS的共享目录/nfs/public，实现所有用户可写，并权限映射到zhangsan. 3.NFS的共享目录/nfs/data，实现root用户可写，其他用户只读，并不映射为匿名用户。 4.配置客户端使用fstab实现重启后自动挂载nfs共享到/data目录 5.使用autofs实现访问时自动挂载nfs共享到/pub目录。 ``` #### 扩展指引 ``` 1.NFS如何固定服务的随机端口 2.NFS配置文件的帮助文档man exports ``` # Samba服务 ##### 1.基本概念 ``` 网络附加存储之samba，是用来让unxix系列的操作系统与微软Windows操作系统的SMB/CIFS网络协议做的链接的自由软件。 主要是用来Linux和windows之间进行数据库共享。 Linux 和Linux之间也可以。 ``` ### 2.基本的安装、配置 #### 只读 #### server ``` 第一步：apt install samba #安装服务 第二步：systemctl status smbd #查看服务状态信息 第三步：vim /etc/samba/smb.conf [public] path = /share/yu #指定共享路径 read only = yes #只允许读 public = yes #是否隐藏目录 #退出保存 第四步：mkdir -p /share/yu #创建文件夹 第五步：cd /share/yu #进入路径 第六步：touch 1.txt #创建文件 第七步：systecmt restart smbd #重启服务 第八步：systecmt status smbd #查看服务状态信息 ``` #### client ``` 方法一：使用mount挂载 第一步：apt install cifs-utils -y #安装所需格式 第二步：mkdir /kk #创建文件夹 第三步：mount -t cifs //192.168.10.1/public /kk #挂载在/kk目录下 第四步：cd /kk #进入路径 第五步：ls #查看当前目录下的文件及文件夹 方法二：使用smbclient连接 第一步：apt install smbclient #安装测试工具 第二步：smbclient -U demo //192.168.10.1/public #-U指定用户 第三步：ls 方法三：Linux桌面连接 ``` ![1][1] ![2][2] ![3][3] ![4][4] ![5][5] 方法四：Windows连接 ![6][6] [1]: https://panfeng-biji.oss-cn-beijing.aliyuncs.com/oss/20211007145325.jpeg [2]: https://panfeng-biji.oss-cn-beijing.aliyuncs.com/oss/20211007145356.jpeg [3]: https://panfeng-biji.oss-cn-beijing.aliyuncs.com/oss/20211007145412.jpeg [4]: https://panfeng-biji.oss-cn-beijing.aliyuncs.com/oss/20211007145430.jpeg [5]: https://panfeng-biji.oss-cn-beijing.aliyuncs.com/oss/20211007145446.jpeg [6]: https://panfeng-biji.oss-cn-beijing.aliyuncs.com/oss/20211007145515.jpeg ### 2.1 创建匿名可写的smb共享 #### server端 ``` 第一步：apt install samba #安装服务 第二步：systemctl status smbd #查看服务状态信息 第三步：vim /etc/samba/smb.conf [public] path = /share/yu #指定共享路径 read only = no #只允许读 或者writable = yes public = yes #是否隐藏目录 #退出保存 第四步：mkdir -p /share/yu #创建文件夹 第五步：cd /share/yu #进入路径 第六步：touch 1.txt #创建文件 第七步：systecmt restart smbd #重启服务 第八步：systecmt status smbd #查看服务状态信息 第九步：chmod 777 /share/yu #赋予权限 ``` #### client端 ``` 方法一：使用mount挂载 第一步：apt install cifs-utils -y #安装所需格式 第二步：mkdir /kk #创建文件夹 第三步：mount -t cifs //192.168.10.1/public /kk #挂载在/kk目录下 第四步：cd /kk #进入路径 第五步：touch 2.txt #创建文件 第六步：ls -lh #查看是否创建成功 方法二：使用smbclient连接 第一步：apt install smbclient #安装测试工具 第二步：touch 3.txt #创建文件 第三步：smbclient -U demo //192.168.10.1/public #-U指定用户 第四步：ls #查看文件及文件夹 第五步：put 3.txt #上传文件 第六步：ls #查看上传文件是否成功 ``` ### 2.2 基于用户验证的共享 #### server端 ``` 第一步：apt install samba #安装服务 第二步：adduser user01 #添加用户 第三步：adduser user02 #添加用户 第四步：vim /etc/samba/smb.conf #打开配置文件 [share] path = /share/yu #共享路径 write list = user01 #只允许user01写入数据 valid users = user01,user02 #允许user01、user02进行读 #退出保存 第五步：mkdir -p /share/yu #递归创建文件夹 第六步：chown user01 /share/yu #更改拥有者 第七步：smbpasswd -a user01 #创建smb user01用户 赋予密码 第八步：smbpasswd -a user02 #创建smb user02用户 赋予密码 第九步：systemctl restart smbd #重启服务 ``` #### client端 ``` 方法一：使用mount挂载 第一步：apt install cifs-utils -y #安装所需格式 第二步：mkdir /kk #创建文件夹 第三步：mount -t cifs -o user=user01 //192.168.10.1/share /kk #挂载在/kk目录下 第四步：cd /kk #进入路径 第五步：ls #查看当前目录下的文件及文件夹 第六步：touch user01.txt #创建文件 第七步：ls -lh #查看文件是否创建成功 第八步：umount /kk #取消挂载 第九步：mount -t cifs -o user=user02 //192.168.10.1/share /kk #使用user02进行挂载 第十步：cd /kk #进入路径 第十一步：ls -lh #查看当前文件及文件夹 第十二步：touch user02.txt #创建文件 touch: cannot touch 'user02.txt': Permission denied #报错提示，没有权限 第十三步：ls -lh #查看文件是否创建成功 方法二：使用smbclient连接 第一步：apt install smbclient #安装测试工具 第二步：touch user01.txt.1 #创建文件 第三步：smbclient -U user01 //192.168.10.1/share #-U指定用户 第四步：ls #查看当前文件及文件夹 第五步：put user01.txt.1 #上传文件 第六步：ls #查看上传文件成功 第七步：exit 第八步：touch user02.txt.1 #创建文件 第九步：smbclient -U user02 //192.168.10.1/share #使用user02登录用户 第十步：ls #查看当前文件及文件夹 第十一步：put user02.txt.1 #上传文件 NT_STATUS_ACCESS_DENIED opening remote file \user02.txt.1 #报错提示，没有权限 第十二步：ls #查看文件上传是否成功 ``` #### 技能实践 ``` 1.共享/samba/public目录，支持匿名用户读写共享 2.共享/samb/doc目录，需要用户zhangsan，密码123456登录后，支持读写共享 3.在Linux系统下访问zhangsan用户家目录（默认已共享，访问时使用smb://192.168.10.1/zhangsan） ``` #### 扩展指引 ``` 共享目录/samba/exam 有如下需求： 1.user01用户对exam目录有读写的权限，并且可以查看，修改，删除所有目录上传的文件或文件夹。 2.user02、user03用户可以对exam目录有读写的权限，但只能查看，修改，删除自己的文件或文件夹。 3.user04用户对exam目录有只读的权限，对目录下文件没有任何权限。 4.所有用户的密码统一为123456 ```