Linux
一、Linux文件系统
在 Linux 操作系统中,所有被操作系统管理的资源,例如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件。
也就是说在 Linux 系统中有一个重要的概念:一切都是文件。
1.inode 介绍
(1)什么是 inode?
inode 是 linux/unix 文件系统的基础。
硬盘的最小存储单位是扇区(Sector),多个扇区组成了块(block)。文件数据存储在块中。块的最常见的大小是 4kb,约为 8 个连续的扇区组成(每个扇区存储 512B)。一个文件可能会占用多个块,但是一个块只能存放一个文件。
虽然我们将文件存储在了块中,但是我们还需要一个空间来存储文件的元信息(metadata):包括某个文件被分成几块、每一块在的地址、文件拥有者、创建时间、权限、大小等。每个文件需要这样的空间来存储自己的元信息。
存储文件元信息的区域就叫索引节点(index+node,简称inode)。 inode 就是用来维护某个文件被分成几块、每一块在的地址、文件拥有者、创建时间、权限、大小等信息。
存储文件元信息的区域就叫索引节点(index+node,简称inode)。 inode 就是用来维护某个文件被分成几块、每一块在的地址、文件拥有者、创建时间、权限、大小等信息。
(2)如何查看文件的 inode 信息?
可以使用 stat 命令查看文件的 inode 信息。
stat + 文件全名
每个 inode 都有一个号码,Linux/Unix 操作系统不使用文件名来区分文件,而是使用 inode 号码区分不同的文件。
2.Linux的文件类型
Linux 支持很多文件类型,其中非常重要的文件类型有: 普通文件、目录文件、链接文件、设备文件、管道文件、Socket 套接字文件等。
3.Linux目录树
一个Linux操作系统中所有可操作的计算机资源都存在于目录树这个结构中,对资源的访问可以看做是对这棵目录树的访问。
(1)目录树结构
Linux 文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录root:
(2)常见目录
二、Linux基本命令
Linux 命令在线速查手册:https://www.w3xue.com/manual/linux/。
三、如何从日志中分析 PV、UV?
日志包含的信息很多,比如对于 nginx 的 access.log 日志,我们可以根据日志信息分析用户行为。
什么用户行为呢?比如分析出哪个页面访问次数(PV)最多、访问人数(UV)最多,以及哪天访问量最多,哪个请求访问最多等等。
下面以一个大概几万条记录的 nginx 日志文件作为案例,来分析出「用户信息」。
1.查看日志文件大小
(1)文件不大直接线上分析
当分析日志时,先用 ls -lh 命令查看日志文件的大小,如果日志文件非常大,最好不要在线上环境做。下面这个日志只有 6.5M,在线上环境分析问题不大。
(2)文件太大怎么处理?
当发现日志很大时,可以使用 scp 命令将文件传输到闲置的服务器再分析:
2.慎用 cat 命令
(1)原因
cat 命令是用来查看文件内容的,但是日志文件数据量有多少,它就读多少,很显然不适用大文件。
(2)less 命令
对于大文件,应该用 less 命令去读文件里的内容,因为 less 并不会加载整个文件,而是按需加载,先是输出一小页的内容,当要往下看的时候,才会继续加载。
可以发现上面的 access.log 日志每一行是一次用户访问的记录,从左到右分别包含如下信息:
- 客户端的 IP 地址;
- 访问时间;
- HTTP 请求的方法、路径、协议版本、协议版本、返回的状态码;
- User Agent,一般是客户端使用的操作系统以及版本、浏览器及版本等;
(3)tail 命令
有时候我们想看日志的最新内容,可以使用 tail -n 命令,比如想查看倒数 5 行的内容:
如果想实时打印日志内容,可以使用 tail -f 命令,这样看日志的时候,就会是阻塞状态,有新日志输出的时候,就会实时显示出来。
(4)PV分析
PV 的全称叫 Page View,用户访问一个页面就是一次 PV,比如大多数博客平台,点击一次页面,阅读量就加 1,所以说 PV 的数量并不代表真实的用户数量,只是个点击量。
对于 nginx 的 acess.log 日志文件来说,日志里的内容是访问记录,所以有多少条日志记录就有多少 PV。
可以使用 wc -l 命令,就可以查看整体的 PV 了,如下图一共有 49903 条 PV。
(5)PV分组
nginx 的 acess.log 日志文件有访问时间的信息,因此可以根据访问时间进行分组,比如按天分组。
-
要按时间分组,可以用awk 命令先把「访问时间」过滤出来。由于访问时间在日志里的第 4 列,因此可以使用 awk '{print $4}' access.log 命令把访问时间的信息过滤出来:
【tips】awk 是一个处理文本的利器,默认是以「空格」为分隔符。
-
上面的信息还包含了时分秒,如果只想显示年月日的信息,可以使用 awk 的 substr 函数,从第 2 个字符开始,截取 11 个字符:
-
然后可以使用 sort 对日期进行排序,然后使用 uniq -c 进行统计,于是按天分组的 PV 就出来了:
可以看到,每天的 PV 量大概在 2000-2800。
(6)UV分析+分组
UV分析与分组类似PV。
(7)终端分析
nginx 的 access.log 日志最末尾关于 User Agent 的信息,主要是客户端访问服务器使用的工具,可能是手机、浏览器等。因此,可以利用这一信息来分析有哪些终端访问了服务器。
User Agent 的信息在日志里的第 12 列,因此先用 awk 过滤出第 12 列的内容后,进行 sort 排序,再用 uniq -c 去重并统计,最后再使用 sort -rn(r 表示逆向排序, n 表示按数值排序) 对统计的结果排序,结果如下图:
User Agent 的信息在日志里的第 12 列,因此先用 awk 过滤出第 12 列的内容后,进行 sort 排序,再用 uniq -c 去重并统计,最后再使用 sort -rn(r 表示逆向排序, n 表示按数值排序) 对统计的结果排序,结果如下图:
(8)分析top3的请求
分析出访问次数最多的3个请求的信息。
在 access.log 日志中,第 7 列是客户端请求的路径,先使用 awk 过滤出第 7 列的内容后,进行 sort 排序,再用 uniq -c 去重并统计,然后再使用 sort -rn 对统计的结果排序,最后使用 head -n 3 分析 TOP3 的请求,结果如下图: