Linux

一、Linux文件系统

        在 Linux 操作系统中,所有被操作系统管理的资源,例如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件。
        也就是说在 Linux 系统中有一个重要的概念:一切都是文件

1.inode 介绍

(1)什么是 inode?

        inode 是 linux/unix 文件系统的基础
        硬盘的最小存储单位扇区(Sector),多个扇区组成了块(block)。文件数据存储在块中。块的最常见的大小是 4kb,约为 8 个连续的扇区组成(每个扇区存储 512B)。一个文件可能会占用多个块,但是一个块只能存放一个文件。
        虽然我们将文件存储在了块中,但是我们还需要一个空间来存储文件的元信息(metadata):包括某个文件被分成几块、每一块在的地址、文件拥有者、创建时间、权限、大小等。每个文件需要这样的空间来存储自己的元信息。
        存储文件元信息的区域就叫索引节点(index+node,简称inode)。 inode 就是用来维护某个文件被分成几块、每一块在的地址、文件拥有者、创建时间、权限、大小等信息。

(2)如何查看文件的 inode 信息?

        可以使用 stat 命令查看文件的 inode 信息。
    stat + 文件全名
        每个 inode 都有一个号码,Linux/Unix 操作系统不使用文件名来区分文件,而是使用 inode 号码区分不同的文件。
        

2.Linux的文件类型

        Linux 支持很多文件类型,其中非常重要的文件类型有: 普通文件目录文件链接文件设备文件管道文件Socket 套接字文件等。
  • 普通文件(-) : 用于存储信息和数据, Linux 用户可以根据访问权限对普通文件进行查看、更改和删除。比如:图片、声音、PDF、text、视频、源代码等等。
  • 目录文件(d,directory file) :目录也是文件的一种,用于表示和管理系统中的文件,目录文件中包含一些文件名和子目录名。打开目录实际上就是打开目录文件。
  • 符号链接文件(l,symbolic link) :保留了指向文件的地址而不是文件本身。
  • 字符设备(c,char) :用来访问字符设备,比如键盘
  • 设备文件(b,block) : 用来访问块设备,比如硬盘、软盘
  • 管道文件(p,pipe)  :  一种特殊类型的文件,用于进程之间的通信
  • 套接字(s,socket) :用于进程间的网络通信,也可以用于本机之间的非网络通信
  • 3.Linux目录树

            一个Linux操作系统中所有可操作的计算机资源都存在于目录树这个结构中,对资源的访问可以看做是对这棵目录树的访问。

    (1)目录树结构

            Linux 文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录root
            

    (2)常见目录

  • /bin: 存放二进制可执行文件(ls、cat、mkdir 等),常用命令一般都在这里
  • /etc: 存放系统管理和配置文件;
  • /home: 存放所有用户文件的根目录,是用户主目录的基点,比如用户 user 的主目录就是/home/user,可以用~user 表示;
  • /usr : 用于存放系统应用程序;
  • /opt: 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把 tomcat 等都安装到这里;
  • /proc: 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;
  • /root: 超级用户(系统管理员)的主目录;
  • /sbin:存放二进制可执行文件,只有 root 才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如 ifconfig 等;
  • /dev: 用于存放设备文件;
  • /mnt: 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;
  • /boot: 存放用于系统引导时使用的各种文件;
  • /lib : 存放着和系统运行相关的库文件
  • /tmp: 用于存放各种临时文件,是公用的临时文件存储点;
  • /var: 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等;
  • /lost+found: 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows 下叫什么.chk)就在这里。
  • 二、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 表示按数值排序) 对统计的结果排序,结果如下图:
            

    (8)分析top3的请求

            分析出访问次数最多的3个请求的信息。
            在 access.log 日志中,第 7 列是客户端请求的路径,先使用 awk 过滤出第 7 列的内容后,进行 sort 排序,再用 uniq -c 去重并统计,然后再使用 sort -rn 对统计的结果排序,最后使用 head -n 3 分析 TOP3 的请求,结果如下图:
            



    全部评论

    相关推荐

    11-04 14:10
    东南大学 Java
    _可乐多加冰_:去市公司包卖卡的
    点赞 评论 收藏
    分享
    评论
    2
    6
    分享
    牛客网
    牛客企业服务