文章目录


资源链接

1 Redis 面试题(2020 最新版) https://thinkwon.blog.csdn.net/article/details/103522351
2 MySQL 数据库面试题(2020 最新版)https://thinkwon.blog.csdn.net/article/details/10477862
3 Linux 面试题(2020 最新版) https://thinkwon.blog.csdn.net/article/details/104588679
4 架构设计 & 分布式 & 数据结构与算法面试题(2020 最新版)https://thinkwon.blog.csdn.net/article/details/105870730

1 Linux 概述

1.1 什么是 Linux

Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

1.2 Unix 和 Linux 有什么区别?

Linux 和 Unix 都是功能强大的操作系统,都是应用广泛的服务器操作系统,有很多相似之处,甚至有一部分人错误地认为 Unix 和 Linux 操作系统是一样的,然而,事实并非如此,以下是两者的区别。

  • 开源性
    Linux 是一款开源操作系统,不需要付费,即可使用;Unix 是一款对源码实行知识产权保护的传统商业软件,使用需要付费授权使用。

  • 跨平台性
    Linux 操作系统具有良好的跨平台性能,可运行在多种硬件平台上;Unix 操作系统跨平台性能较弱,大多需与硬件配套使用。

  • 可视化界面
    Linux 除了进行命令行操作,还有窗体管理系统;Unix 只是命令行下的系统。

  • 硬件环境
    Linux 操作系统对硬件的要求较低,安装方法更易掌握;Unix 对硬件要求比较苛刻,按照难度较大。

  • 用户群体
    Linux 的用户群体很广泛,个人和企业均可使用;Unix 的用户群体比较窄,多是安全性要求高的大型企业使用,如银行、电信部门等,或者 Unix 硬件厂商使用,如 Sun 等。
    相比于 Unix 操作系统,Linux 操作系统更受广大计算机爱好者的喜爱,主要原因是 Linux 操作系统具有 Unix 操作系统的全部功能,并且能够在普通 PC 计算机上实现全部的 Unix 特性,开源免费的特性,更容易普及使用!

1.3 什么是 Linux 内核?

Linux 系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。

  • 系统内存管理
  • 应用程序管理
  • 硬件设备管理
  • 文件系统管理

1.4 Linux 的基本组件是什么?

就像任何其他典型的操作系统一样,Linux 拥有所有这些组件:内核,shell 和 GUI,系统实用程序和应用程序。Linux 比其他操作系统更具优势的是每个方面都附带其他功能,所有代码都可以免费下载。

1.5 Linux 的体系结构

从大的方面讲,Linux 体系结构可以分为两块:

  • 用户空间 (User Space) :用户空间又包括用户的应用程序 (User Applications)、C 库 (C Library) 。
  • 内核空间 (Kernel Space) :内核空间又包括系统调用接口 (System Call Interface)、内核 (Kernel)、平台架构相关的代码 (Architecture-Dependent Kernel Code) 。

1.6 为什么 Linux 体系结构要分为用户空间和内核空间?

  • 1、现代 CPU 实现了不同的工作模式,不同模式下 CPU 可以执行的指令和访问的寄存器不同。
  • 2、Linux 从 CPU 的角度出发,为了保护内核的安全,把系统分成了两部分。

用户空间和内核空间是程序执行的两种不同的状态,我们可以通过两种方式完成用户空间到内核空间的转移:1)系统调用;2)硬件中断。

1.7 BASH 和 DOS 的基本区别?

BASH 和 DOS 控制台之间的主要区别在于 3 个方面:

  • BASH 命令区分大小写,而 DOS 命令则不区分;
  • 在 BASH 下,/character 是目录分隔符,\ 作为转义字符。在 DOS 下,/ 用作命令参数分隔符,\ 是目录分隔符
  • DOS 遵循命名文件中的约定,即 8 个字符的文件名后跟一个点,扩展名为 3 个字符。BASH 没有遵循这样的惯例。

1.8 Linux 开机启动过程?

  • 1、主机加电自检,加载 BIOS 硬件信息。

  • 2、读取 MBR 的引导文件 (GRUB、LILO)。

  • 3、引导 Linux 内核。

  • 4、运行第一个进程 init (进程号永远为 1)。

  • 5、进入相应的运行级别。

  • 6、运行终端,输入用户名和密码。

1.9 Linux 系统缺省的运行级别?

  • 关机。
  • 单机用户模式。
  • 字符界面的多用户模式 (不支持网络)。
  • 字符界面的多用户模式。
  • 未分配使用。
  • 图形界面的多用户模式。
  • 重启。

1.10 Linux 使用的进程间通信方式?

1、管道 (pipe)、流管道 (s_pipe)、有名管道 (FIFO)。
2、信号 (signal) 。
3、消息队列。
4、共享内存。
5、信号量。
6、套接字 (socket) 。

1.11 Linux 有哪些系统日志文件?

比较重要的是 /var/log/messages 日志文件。

该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵。

另外,如果胖友的系统里有 ELK 日志集中收集,它也会被收集进去。

1.12 Linux 系统安装多个桌面环境有帮助吗?

通常,一个桌面环境,如 KDE 或 Gnome,足以在没有问题的情况下运行。尽管系统允许从一个环境切换到另一个环境,但这对用户来说都是优先考虑的问题。有些程序在一个环境中工作而在另一个环境中无法工作,因此它也可以被视为选择使用哪个环境的一个因素。

1.13 什么是交换空间?

交换空间是 Linux 使用的一定空间,用于临时保存一些并发运行的程序。当 RAM 没有足够的内存来容纳正在执行的所有程序时,就会发生这种情况。

1.14 什么是 root 帐户

root 帐户就像一个系统管理员帐户,允许你完全控制系统。你可以在此处创建和维护用户帐户,为每个帐户分配不同的权限。每次安装 Linux 时都是默认帐户。

1.15 什么是 LILO?

LILO 是 Linux 的引导加载程序。它主要用于将 Linux 操作系统加载到主内存中,以便它可以开始运行。

1.16 什么是 BASH?

BASH 是 Bourne Again SHell 的缩写。它由 Steve Bourne 编写,作为原始 Bourne Shell(由 /bin/sh 表示)的替代品。它结合了原始版本的 Bourne Shell 的所有功能,以及其他功能,使其更容易使用。从那以后,它已被改编为运行 Linux 的大多数系统的默认 shell。

1.17 什么是 CLI?

命令行界面(英语:command-line interface,缩写]:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(CUI)。

通常认为,命令行界面(CLI)没有图形用户界面(GUI)那么方便用户操作。因为,命令行界面的软件通常需要用户记忆操作的命令,但是,由于其本身的特点,命令行界面要较图形用户界面节约计算机系统的资源。在熟记命令的前提下,使用命令行界面往往要较使用图形用户界面的操作速度要快。所以,图形用户界面的操作系统中,都保留着可选的命令行界面。

1.18 什么是 GUI?

图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。

图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。

1.19 开源的优势是什么?

开源允许你将软件(包括源代码)免费分发给任何感兴趣的人。然后,人们可以添加功能,甚至可以调试和更正源代码中的错误。它们甚至可以让它运行得更好,然后再次自由地重新分配这些增强的源代码。这最终使社区中的每个人受益。

1.20 GNU 项目的重要性是什么?

这种所谓的自由软件运动具有多种优势,例如可以自由地运行程序以及根据你的需要自由学习和修改程序。它还允许你将软件副本重新分发给其他人,以及自由改进软件并将其发布给公众。

2 磁盘、目录、文件

2.1 简单 Linux 文件系统?

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

也就是说在 Linux 系统中有一个重要的概念 **:一切都是文件 **。其实这是 Unix 哲学的一个体现,而 Linux 是重写 Unix 而来,所以这个概念也就传承了下来。在 Unix 系统中,把一切资源都看作是文件,包括硬件设备。UNIX 系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。

Linux 支持 5 种文件类型,如下图所示:

2.2 Linux 的目录结构是怎样的?

这个问题,一般不会问。更多是实际使用时,需要知道。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
常见目录说明:

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

2.3 什么是 inode ?

一般来说,面试不会问 inode 。但是 inode 是一个重要概念,是理解 Unix/Linux 文件系统和硬盘储存的基础。

理解 inode,要从文件储存说起。

文件储存在硬盘上,硬盘的最小存储单位叫做 "扇区"(Sector)。每个扇区储存 512 字节(相当于 0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个 "块"(block)。这种由多个扇区组成的 "块",是文件存取的最小单位。"块" 的大小,最常见的是 4KB,即连续八个 sector 组成一个 block。

文件数据都储存在 "块" 中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做 inode,中文译名为 "索引节点"。

每一个文件都有对应的 inode,里面包含了与该文件有关的一些信息。

2.4 简述 Linux 文件系统通过 i 节点把文件的逻辑结构和物理结构转换的工作过程?

Linux 通过 inode 节点表将文件的逻辑结构和物理结构进行转换。

inode 节点是一个 64 字节长的表,表中包含了文件的相关信息,其中有文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息。在 inode 节点表中最重要的内容是磁盘地址表。在磁盘地址表中有 13 个块号,文件将以块号在磁盘地址表中出现的顺序依次读取相应的块。
Linux 文件系统通过把 inode 节点和文件名进行连接,当需要读取该文件时,文件系统在当前目录表中查找该文件名对应的项,由此得到该文件相对应的 inode 节点号,通过该 inode 节点的磁盘地址表把分散存放的文件物理块连接成文件的逻辑结构。

2.5 什么是硬链接和软链接?

​ 1)硬链接

由于 Linux 下的文件是通过索引节点 (inode) 来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配 inode 。每添加一个一个硬链接,文件的链接数就加 1 。

不足:1)不可以在不同文件系统的文件间建立链接;2)只有超级用户才可以为目录创建硬链接。
2)软链接

软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。

不足:因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。
实际场景下,基本是使用软链接。总结区别如下:

  • 硬链接不可以跨分区,软件链可以跨分区。
  • 硬链接指向一个 inode 节点,而软链接则是创建一个新的 inode 节点。
  • 删除硬链接文件,不会删除原文件,删除软链接文件,会把原文件删除。

2.6 RAID 是什么?

RAID 全称为独立磁盘冗余阵列 (Redundant Array of Independent Disks),基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使性能达到甚至超过一个价格昂贵、 容量巨大的硬盘。RAID 通常被用在服务器电脑上,使用完全相同的硬盘组成一个逻辑扇区,因此操作系统只会把它当做一个硬盘。

RAID 分为不同的等级,各个不同的等级均在数据可靠性及读写性能上做了不同的权衡。在实际应用中,可以依据自己的实际需求选择不同的 RAID 方案。

当然,因为很多公司都使用云服务,大家很难接触到 RAID 这个概念,更多的可能是普通云盘、SSD 云盘的概念。

3 网络安全

3.1 一台 Linux 系统初始化环境后需要做一些什么安全工作?

  • 1、添加普通用户登陆,禁止 root 用户登陆,更改 SSH 端口号。

  • 2、服务器使用密钥登陆,禁止密码登陆。

  • 3、开启防火墙,关闭 SElinux ,根据业务需求设置相应的防火墙规则。

  • 4、装 fail2ban 这种防止 SSH 暴力破击的软件。

  • 5、设置只允许公司办公网出口 IP 能登陆服务器 (看公司实际需要)

​ 也可以安装 VPN 等软件,只允许连接 VPN 到服务器上。

  • 6、修改历史命令记录的条数为 10 条。
  • 7、只允许有需要的服务器可以访问外网,其它全部禁止。
  • 8、做好软件层面的防护。
    • 8.1 设置 nginx_waf 模块防止 SQL 注入。
    • 8.2 把 Web 服务使用 www 用户启动,更改网站目录的所有者和所属组为 www 。

3.2 什么叫 CC 攻击?什么叫 DDOS 攻击?

CC 攻击,主要是用来攻击页面的,模拟多个用户不停的对你的页面进行访问,从而使你的系统资源消耗殆尽。

DDOS 攻击,中文名叫分布式拒绝服务攻击,指借助服务器技术将多个计算机联合起来作为攻击平台,来对一个或多个目标发动 DDOS 攻击。

攻击,即是通过大量合法的请求占用大量网络资源,以达到瘫痪网络的目的。

3.3 怎么预防 CC 攻击和 DDOS 攻击?

防 CC、DDOS 攻击,这些只能是用硬件防火墙做流量清洗,将攻击流量引入黑洞。

流量清洗这一块,主要是买 ISP 服务商的防攻击的服务就可以,机房一般有空余流量,我们一般是买服务,毕竟攻击不会是持续长时间。

3.4 什么是网站数据库注入?

由于程序员的水平及经验参差不齐,大部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断。
应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的 SQL 注入。
SQL 注入,是从正常的 WWW 端口访问,而且表面看起来跟一般的 Web 页面访问没什么区别,如果管理员没查看日志的习惯,可能被入侵很长时间都不会发觉。
如何过滤与预防?

数据库网页端注入这种,可以考虑使用 nginx_waf 做过滤与预防。

4 Shell 之 sed

写一个 sed 命令,修改 /tmp/input.txt 文件的内容?
要求:

  • 删除所有空行。

  • 一行中,如果包含 “11111”,则在 “11111” 前面插入 “AAA”,在 “11111” 后面插入 “BBB” 。比如:将内容为 0000111112222 的一行改为 0000AAA11111BBB2222 。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    [root@~]## cat -n /tmp/input.txt
    1 000011111222
    2
    3 000011111222222
    4 11111000000222
    5
    6
    7 111111111111122222222222
    8 2211111111
    9 112222222
    10 1122
    11

    ## 删除所有空行命令
    [root@~]## sed '/^$/d' /tmp/input.txt
    000011111222
    000011111222222
    11111000000222
    111111111111122222222222
    2211111111
    112222222
    1122

    ## 插入指定的字符
    [root@~]## sed 's#\(11111\)#AAA\1BBB#g' /tmp/input.txt
    0000AAA11111BBB222
    0000AAA11111BBB222222
    AAA11111BBB000000222
    AAA11111BBBAAA11111BBB11122222222222
    22AAA11111BBB111
    112222222
    1122

sed 命令用法简析:

# echo -e “booktestbook\nbook\n\ntest”>abc 实验文件创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
1.替换命令s
\# sed -n ‘s/book/BOOK/p‘ abc
BOOKtestbook
BOOK
2.显示行内容命令-n p(p :打印 print
显示12-19行的内容:# sed -n ‘12,19p‘ file

如果想修改 需要加入 -i 参数
\# sed -i ‘s/book/BOOK/p‘ abc
这里就是把源文件中的所有book 都替换成了BOOK
3.上个命令的 g 参数是作用是 全部替换
比较一下加不加 g 的区别
\# sed -n ‘s/book/BOOK/p‘ abc
BOOKtestbook
BOOK
没有替换所有的book字符
\# sed -n ‘s/book/BOOK/gp‘ abc
BOOKtestBOOK
BOOK
替换了所有的book字符
如果需要从N处开始替换,可以使用Ng
\# echo abababab | sed ‘s/ab/AB/2g‘
abABABAB
\# echo abababab | sed ‘s/ab/AB/3g‘
ababABAB
4.删除命令 d
\# sed ‘/^$/d‘ abc (删除空行)
booktestbook
book
test
(类似命令 grep -v
\# grep -v "^$" abc
booktestbook
book
test)

sed ‘1d‘ abc (删除第一行)

book

test

sed ‘1,$d‘ abc ($代表最后一行,删除所有行)

sed ‘1,2d‘ abc (删除第一和第二行)

test

sed ‘$d‘ abc (删除最后一行)

booktestbook
book

sed ‘/^b/d‘ abc (删除以b 开头的行)

test
#
6.已匹配字符串标记 & (\w\+ 匹配每个单词)
\# echo hello world | sed ‘s/\w\+/[&]/‘
[hello] world
\# echo hello world | sed ‘s/\w\+/[&]/g‘ (更加加深了对g 使用的了解)
[hello] [world]
所有以192.168.1.120开头的都替换成自己加:localhost
这里以nginx的访问日中为例:
\# sed ‘s/^192.168.1.120/&:localhost/g‘ /application/nginx/logs/20170202_access_www.log | awk ‘{print $1}‘|grep 120
192.168.1.120:localhost

awk ‘{print $1}‘ 是提取出第一列 grep 120 找到 192.168.1.120
7.子串匹配标记 \1
\# echo BBB bbb | sed ‘s/\([A-Z]\+\) \([a-z]\+\)/\2 \1/‘
bbb BBB
\# echo loveable | sed ‘s/\(love\)able/\1evol/‘
loveevol
8.选定行的范围"," 在行上插入 i\ 在行下追加 a\ 替换本行 c\
\# sed ‘/^book/,/^test/i\abc‘ abc (在以book和test开头的行上面写入abc)
abc
booktestbook
abc
book
abc

abc
test
\# sed ‘/^book/,/^test/a\abc‘ abc (在以book和test开头的行下面写入abc)
booktestbook
abc
book
abc

abc
test
abc
\# sed -e ‘/^$/d‘ abc -e ‘/test/ c \give‘
give
book
give
9.多点编辑 命令 e
\# sed -e ‘/^$/d‘ -e ‘s/book/BOOK/g‘ abc
BOOKtestBOOK
BOOK
test
10.下一个 n 命令: (如果book被匹配,则移动到匹配行的下一个将book替换成bookabc
\# sed ‘/book/{n; s/\([a-z]\+\)/\1abc/;}‘ abc
booktestbook
bookabc

test
11.写入文件 w 命令 和 读取文件 r 命令
将abc中的包含book的行写入到 book
\# sed ‘/book/w book‘ abc
booktestbook
book

test
查看文件book 和abc
\# cat book
booktestbook
book
\# cat abc
booktestbook
book

test
逐行读取文件book中含有book的字符的行。如果abc中也含有book并且行号一样,则显示在后面
\# sed ‘/book/r book‘ abc
booktestbook
booktestbook
book
book
booktestbook
book

test
12.退出 q
\# sed ‘2q‘ abc
打印出第二行后退出。

5 Linux 相关经典问题

5.1 如何选择 Linux 操作系统版本?

一般来讲,桌面用户首选 Ubuntu ;服务器首选 RHEL 或 CentOS ,两者中首选 CentOS 。

根据具体要求:

  • 安全性要求较高,则选择 Debian 或者 FreeBSD 。、
  • 需要使用数据库高级服务和电子邮件网络应用的用户可以选择 SUSE 。
  • 想要新技术新功能可以选择 Feddora ,Feddora 是 RHEL 和 CentOS 的一个测试版和预发布版本。

【重点】根据现有状况,绝大多数互联网公司选择 CentOS 。现在比较常用的是 6 系列,现在市场占有大概一半左右。另外的原因是 CentOS 更侧重服务器领域,并且无版权约束。

5.2 如何规划一台 Linux 主机,步骤是怎样?

  • 1、确定机器是做什么用的,比如是做 WEB 、DB、还是游戏服务器。

  • 2、确定好之后,就要定系统需要怎么安装,默认安装哪些系统、分区怎么做。

  • 3、需要优化系统的哪些参数,需要创建哪些用户等等的。

5.3 请问当用户反馈网站访问慢,你会如何处理?

5.3.1 有哪些方面的因素会导致网站网站访问慢?

1、服务器出口带宽不够用

本身服务器购买的出口带宽比较小。一旦并发量大的话,就会造成分给每个用户的出口带宽就小,访问速度自然就会慢。
跨运营商网络导致带宽缩减。例如,公司网站放在电信的网络上,那么客户这边对接是长城宽带或联通,这也可能导致带宽的缩减。
2、服务器负载过大,导致响应不过来

可以从两个方面入手分析:

分析系统负载,使用 w 命令或者 uptime 命令查看系统负载。如果负载很高,则使用 top 命令查看 CPU ,MEM 等占用情况,要么是 CPU 繁忙,要么是内存不够。
如果这二者都正常,再去使用 sar 命令分析网卡流量,分析是不是遭到了攻击。一旦分析出问题的原因,采取对应的措施解决,如决定要不要杀死一些进程,或者禁止一些访问等。
3、数据库瓶颈

如果慢查询比较多。那么就要开发人员或 DBA 协助进行 SQL 语句的优化。
如果数据库响应慢,考虑可以加一个数据库缓存,如 Redis 等。然后,也可以搭建 MySQL 主从,一台 MySQL 服务器负责写,其他几台从数据库负责读。
4、网站开发代码没有优化好

例如 SQL 语句没有优化,导致数据库读写相当耗时。

5.3.2 针对网站访问慢,怎么去排查?

1、确定问题

首先要确定是用户端还是服务端的问题。当接到用户反馈访问慢,那边自己立即访问网站看看,如果自己这边访问快,基本断定是用户端问题,就需要耐心跟客户解释,协助客户解决问题。

不要上来就看服务端的问题。一定要从源头开始,逐步逐步往下。

2、浏览器调试工具

如果访问也慢,那么可以利用浏览器的调试功能,看看加载那一项数据消耗时间过多,是图片加载慢,还是某些数据加载慢。

3、查服务器负载情况

查看服务器硬件 (网络、CPU、内存) 的消耗情况。如果是购买的云主机,比如阿里云,可以登录阿里云平台提供各方面的监控,比如 CPU、内存、带宽的使用情况。

4、查日志

如果发现硬件资源消耗都不高,那么就需要通过查日志,比如看看 MySQL 慢查询的日志,看看是不是某条 SQL 语句查询慢,导致网站访问慢。

5.3.3 针对网站访问慢,怎么去解决?

1、如果是出口带宽问题,那么久申请加大出口带宽。
2、如果慢查询比较多,那么就要开发人员或 DBA 协助进行 SQL 语句的优化。
3、如果数据库响应慢,考虑可以加一个数据库缓存,如 Redis 等等。然后也可以搭建 MySQL 主从,一台 MySQL 服务器负责写,其他几台从数据库负责读。
4、申请购买 CDN 服务,加载用户的访问。
5、如果访问还比较慢,那就需要从整体架构上进行优化咯。做到专角色专用,多台服务器提供同一个服务。

5.3.4 Linux 性能调优都有哪几种方法?

1、Disabling daemons (关闭 daemons)。
2、Shutting down the GUI (关闭 GUI)。
3、Changing kernel parameters (改变内核参数)。
4、Kernel parameters (内核参数)。
5、Tuning the processor subsystem (处理器子系统调优)。
6、Tuning the memory subsystem (内存子系统调优)。
7、Tuning the file system (文件系统子系统调优)。
8、Tuning the network subsystem(网络子系统调优)。

6 网络通讯命令

6.1 ifconfig 命令

  • ifconfig 用于查看和配置 Linux 系统的网络接口。
  • 查看所有网络接口及其状态:ifconfig -a 。
  • 使用 up 和 down 命令启动或停止某个接口:ifconfig eth0 up 和 ifconfig eth0 down 。

6.2 iptables 命令

iptables ,是一个配置 Linux 内核防火墙的命令行工具。功能非常强大,对于我们开发来说,主要掌握如何开放端口即可。例如:

  • 把来源 IP 为 192.168.1.101 访问本机 80 端口的包直接拒绝

    1
    iptables -I INPUT -s 192.168.1.101 -p tcp --dport 80 -j REJECT
  • 开启 80 端口,因为 web 对外都是这个端口

    1
    iptables -A INPUT -p tcp --dport 80 -j ACCEP

    另外,要注意使用 iptables save 命令,进行保存。否则,服务器重启后,配置的规则将丢失。

6.3 netstat 命令

  • Linux netstat 命令用于显示网络状态。

  • 利用 netstat 指令可让你得知整个 Linux 系统的网络情况。

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]

参数说明:
-a或–all 显示所有连线中的Socket。
-A<网络类型>或–<网络类型> 列出该网络类型连线中的相关地址。
-c或–continuous 持续列出网络状态。
-C或–cache 显示路由器配置的快取信息。
-e或–extend 显示网络其他相关信息。
-F或–fib 显示FIB。
-g或–groups 显示多重广播功能群组组员名单。
-h或–help 在线帮助。
-i或–interfaces 显示网络界面信息表单。
-l或–listening 显示监控中的服务器的Socket。
-M或–masquerade 显示伪装的网络连线。
-n或–numeric 直接使用IP地址,而不通过域名服务器。
-N或–netlink或–symbolic 显示网络硬件外围设备的符号连接名称。
-o或–timers 显示计时器。
-p或–programs 显示正在使用Socket的程序识别码和程序名称。
-r或–route 显示Routing Table。
-s或–statistice 显示网络工作信息统计表。
-t或–tcp 显示TCP传输协议的连线状况。
-u或–udp 显示UDP传输协议的连线状况。
-v或–verbose 显示指令执行过程。
-V或–version 显示版本信息。
-w或–raw 显示RAW传输协议的连线状况。
-x或–unix 此参数的效果和指定"-A unix"参数相同。
–ip或–inet 此参数的效果和指定"-A inet"参数相同。

实例

如何查看系统都开启了哪些端口?

1
2
3
4
5
6
7
8
9
10
[root@centos6 ~ 13:20 #55]# netstat -lnp
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:22 0.0.0.0:* LISTEN 1035/sshd
tcp 0 0 :::22 :::* LISTEN 1035/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 931/dhclient
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 6825 1/init @/com/ubuntu/upstart
unix 2 [ ACC ] STREAM LISTENING 8429 1003/dbus-daemon /var/run/dbus/system_bus_socket

如何查看网络连接状况?

1
2
3
4
5
6
7
[root@centos6 ~ 13:22 #58]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 192.168.147.130:22 192.168.147.1:23893 ESTABLISHED
tcp 0 0 :::22 :::* LISTEN
udp 0 0 0.0.0.0:68 0.0.0.0:*

如何统计系统当前进程连接数?

  • 输入命令 netstat -an | grep ESTABLISHED | wc -l 。
  • 输出结果 177 。一共有 177 连接数。

用 netstat 命令配合其他命令,按照源 IP 统计所有到 80 端口的 ESTABLISHED 状态链接的个数?<此题目考验的是对 awk 的使用>

首先,使用 netstat -an|grep ESTABLISHED 命令。结果如下:

1
2
3
4
5
6
7
tcp        0      0 120.27.146.122:80       113.65.18.33:62721      ESTABLISHED
tcp 0 0 120.27.146.122:80 27.43.83.115:47148 ESTABLISHED
tcp 0 0 120.27.146.122:58838 106.39.162.96:443 ESTABLISHED
tcp 0 0 120.27.146.122:52304 203.208.40.121:443 ESTABLISHED
tcp 0 0 120.27.146.122:33194 203.208.40.122:443 ESTABLISHED
tcp 0 0 120.27.146.122:53758 101.37.183.144:443 ESTABLISHED
tcp 0 0 120.27.146.122:27017 23.105.193.30:50556 ESTABLISHE

6.4 ping 命令

Linux ping 命令用于检测主机。

执行 ping 指令会使用 ICMP 传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。

指定接收包的次数

1
ping -c 2 www.baidu.com

6.5 telnet 命令

Linux telnet 命令用于远端登入。

执行 telnet 指令开启终端机阶段作业,并登入远端主机。

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
telnet [-8acdEfFKLrx][-b<主机别名>][-e<脱离字符>][-k<域名>][-l<用户名称>][-n<记录文件>][-S<服务类型>][-X<认证形态>][主机名称或IP地址<通信端口>]

参数说明:

-8 允许使用8位字符资料,包括输入与输出。
-a 尝试自动登入远端系统。
-b<主机别名> 使用别名指定远端主机名称。
-c 不读取用户专属目录里的.telnetrc文件。
-d 启动排错模式。
-e<脱离字符> 设置脱离字符。
-E 滤除脱离字符。
-f 此参数的效果和指定"-F"参数相同。
-F 使用Kerberos V5认证时,加上此参数可把本地主机的认证数据上传到远端主机。
-k<域名> 使用Kerberos认证时,加上此参数让远端主机采用指定的领域名,而非该主机的域名。
-K 不自动登入远端主机。
-l<用户名称> 指定要登入远端主机的用户名称。
-L 允许输出8位字符资料。
-n<记录文件> 指定文件记录相关信息。
-r 使用类似rlogin指令的用户界面。
-S<服务类型> 设置telnet连线所需的IP TOS信息。
-x 假设主机有支持数据加密的功能,就使用它。
-X<认证形态> 关闭指定的认证形态。

实例

登录远程主机

登录 IP 为 192.168.0.5 的远程主机

1
telnet 192.168.0.5 

7 系统管理命令

7.1 date 命令

显示或设定系统的日期与时间。

命令参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-d<字符串>  显示字符串所指的日期与时间。字符串前后必须加上双引号。
-s<字符串>  根据字符串来设置日期与时间。字符串前后必须加上双引号。
-u  显示GMT。
%H 小时(00-23)
%I 小时(00-12)
%M 分钟(以00-59来表示)
%s 总秒数。起算时间为1970-01-01 00:00:00 UTC。
%S 秒(以本地的惯用法来表示)
%a 星期的缩写。
%A 星期的完整名称。
%d 日期(以01-31来表示)。
%D 日期(含年月日)。
%m 月份(以01-12来表示)。
%y 年份(以00-99来表示)。
%Y 年份(以四位数来表示)。

实例:

(1)显示下一天

1
date +%Y%m%d --date="+1 day"  //显示下一天的日期

(2)-d 参数使用

1
2
3
4
5
6
7
date -d "nov 22"  今年的 11 月 22 日是星期三
date -d '2 weeks' 2周后的日期
date -d 'next monday' (下周一的日期)
date -d next-day +%Y%m%d(明天的日期)或者:date -d tomorrow +%Y%m%d
date -d last-day +%Y%m%d(昨天的日期) 或者:date -d yesterday +%Y%m%d
date -d last-month +%Y%m(上个月是几月)
date -d next-month +%Y%m(下个月是几月)

7.2 free 命令

显示系统内存使用情况,包括物理内存、交互区内存 (swap) 和内核缓冲区内存。

1
2
3
4
5
6
7
8
命令参数:

-b 以Byte显示内存使用情况
-k 以kb为单位显示内存使用情况
-m 以mb为单位显示内存使用情况
-g 以gb为单位显示内存使用情况
-s<间隔秒数> 持续显示内存
-t 显示内存使用总合

实例:

(1)显示内存使用情况

1
2
3
free
free -k
free -m

(2)以总和的形式显示内存的使用信息

1
free -t

(3)周期性查询内存使用情况

1
free -s 10

7.3 kill 命令

发送指定的信号到相应进程。不指定型号将发送 SIGTERM(15)终止指定进程。如果任无法终止该程序可用 "-KILL" 参数,其发送的信号为 SIGKILL (9) ,将强制结束进程,使用 ps 命令或者 jobs 命令可以查看进程号。root 用户将影响用户的进程,非 root 用户只能影响自己的进程。

常用参数:

1
2
3
4
5
-l  信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称
-a 当处理当前进程时,不限制命令名和进程号的对应关系
-p 指定kill 命令只打印相关进程的进程号,而不发送任何信号
-s 指定发送信号
-u 指定用户

实例:

(1)先使用 ps 查找进程 pro1,然后用 kill 杀掉

1
kill -9 $(ps -ef | grep pro1)

7.4 ps 命令

ps (process status),用来查看当前运行的进程状态,一次性查看,如果需要动态连续结果使用 top

linux 上进程有 5 种状态:

  • 运行 (正在运行或在运行队列中等待)
  • 中断 (休眠中,受阻,在等待某个条件的形成或接受到信号)
  • 不可中断 (收到信号不唤醒和不可运行,进程必须等待直到有中断发生)
  • 僵死 (进程已终止,但进程描述符存在,直到父进程调用 wait4 () 系统调用后释放)
  • 停止 (进程收到 SIGSTOP, SIGSTP, SIGTIN, SIGTOU 信号后停止运行运行)

ps 工具标识进程的 5 种状态码:

  • D 不可中断 uninterruptible sleep (usually IO)
  • R 运行 runnable (on run queue)
  • S 中断 sleeping
  • T 停止 traced or stopped
  • Z 僵死 a defunct (”zombie”) process
1
2
3
4
5
6
7
8
9
10
命令参数:

-A 显示所有进程
a 显示所有进程
-a 显示同一终端下所有进程
c 显示进程真实名称
e 显示环境变量
f 显示进程间的关系
r 显示当前终端运行的进程
-aux 显示所有包含其它使用的进程

实例:

(1)显示当前所有进程环境变量及进程间关系

1
ps -ef

(2)显示当前所有进程

1
ps -A

(3)与 grep 联用查找某进程

1
ps -aux | grep apache

(4)找出与 cron 与 syslog 这两个服务有关的 PID 号码

1
ps aux | grep '(cron|syslog)'

7.5 rpm 命令

Linux rpm 命令用于管理套件。

rpm (redhat package manager) 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项套件的程序,由于它遵循 GPL 规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM 套件管理方式的出现,让 Linux 易于安装,升级,间接提升了 Linux 的适用度。

  • 查看系统自带 jdk

rpm -qa | grep jdk

  • 删除系统自带 jdk

rpm -e --nodeps 查看 jdk 显示的数据

  • 安装 jdk

rpm -ivh jdk-7u80-linux-x64.rpm

7.6 top 命令

显示当前系统正在执行的进程的相关信息,包括进程 ID、内存占用率、CPU 占用率等

1
2
3
4
5
6
常用参数:

-c 显示完整的进程命令
-s 保密模式
-p <进程号> 指定进程显示
-n <次数>循环显示次数

实例:

1
2
3
4
5
6
7
top - 14:06:23 up 70 days, 16:44,  2 users,  load average: 1.25, 1.32, 1.35
Tasks: 206 total, 1 running, 205 sleeping, 0 stopped, 0 zombie
Cpu(s): 5.9%us, 3.4%sy, 0.0%ni, 90.4%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 32949016k total, 14411180k used, 18537836k free, 169884k buffers
Swap: 32764556k total, 0k used, 32764556k free, 3612636k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28894 root 22 0 1501m 405m 10m S 52.2 1.3 2534:16 java

前五行是当前系统情况整体的统计信息区。

第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:

14:06:23 — 当前系统时间

up 70 days, 16:44 — 系统已经运行了 70 天 16 小时 44 分钟(在这期间系统没有重启过的吆!)

2 users — 当前有 2 个用户登录系统

load average: 1.15, 1.42, 1.44 — load average 后面的三个数分别是 1 分钟、5 分钟、15 分钟的负载情况。

load average 数据是每隔 5 秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑 CPU 的数量,结果高于 5 的时候就表明系统在超负荷运转了。

第二行,Tasks — 任务(进程),具体信息说明如下:

系统现在共有 206 个进程,其中处于运行中的有 1 个,205 个在休眠(sleep),stoped 状态的有 0 个,zombie 状态(僵尸)的有 0 个。

第三行,cpu 状态信息,具体属性说明如下:

5.9% us — 用户空间占用 CPU 的百分比。
3.4% sy — 内核空间占用 CPU 的百分比。
0.0% ni — 改变过优先级的进程占用 CPU 的百分比
90.4% id — 空闲 CPU 百分比
0.0% wa — IO 等待占用 CPU 的百分比
0.0% hi — 硬中断(Hardware IRQ)占用 CPU 的百分比
0.2% si — 软中断(Software Interrupts)占用 CPU 的百分比

备注:在这里 CPU 的使用比率和 windows 概念不同,需要理解 linux 系统用户空间和内核空间的相关知识!

第四行,内存状态,具体信息如下:

32949016k total — 物理内存总量(32GB)
14411180k used — 使用中的内存总量(14GB)
18537836k free — 空闲内存总量(18GB)
169884k buffers — 缓存的内存量 (169M)
第五行,swap 交换分区信息,具体信息说明如下:

32764556k total — 交换区总量(32GB)
0k used — 使用的交换区总量(0K)
32764556k free — 空闲交换区总量(32GB)
3612636k cached — 缓冲的交换区总量(3.6GB)
第六行,空行。

第七行以下:各进程(任务)的状态监控,项目列信息说明如下:

  • PID — 进程 id
  • USER — 进程所有者
  • PR — 进程优先级
  • NI — nice 值。负值表示高优先级,正值表示低优先级
  • VIRT — 进程使用的虚拟内存总量,单位 kb。VIRT=SWAP+RES
  • RES — 进程使用的、未被换出的物理内存大小,单位 kb。RES=CODE+DATA
  • SHR — 共享内存大小,单位 kb
  • S — 进程状态。D = 不可中断的睡眠状态 R = 运行 S = 睡眠 T = 跟踪 / 停止 Z = 僵尸进程
  • % CPU — 上次更新到现在的 CPU 时间占用百分比
  • % MEM — 进程使用的物理内存百分比
  • TIME+ — 进程使用的 CPU 时间总计,单位 1/100 秒
  • COMMAND — 进程名称(命令名 / 命令行)
1
2
3
4
5
6
7
8
9
top 交互命令

h 显示top交互命令帮助信息
c 切换显示命令名称和完整命令行
m 以内存使用率排序
P 根据CPU使用百分比大小进行排序
T 根据时间/累计时间进行排序
W 将当前设置写入~/.toprc文件中
o或者O 改变显示项目的顺序

7.7 yum 命令

yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。

基於 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。

yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。

  • 1. 列出所有可更新的软件清单命令:yum check-update
  • 2. 更新所有软件命令:yum update
  • 3. 仅安装指定的软件命令:yum install <package_name>
  • 4. 仅更新指定的软件命令:yum update <package_name>
  • 5. 列出所有可安裝的软件清单命令:yum list
  • 6. 删除软件包命令:yum remove <package_name>
  • 7. 查找软件包 命令:yum search
  • 8. 清除缓存命令:
    • yum clean packages: 清除缓存目录下的软件包
    • yum clean headers: 清除缓存目录下的 headers
    • yum clean oldheaders: 清除缓存目录下旧的 headers
    • yum clean, yum clean all (= yum clean packages; yum clean oldheaders) : 清除缓存目录下的软件包及旧的 headers

实例

安装 pam-devel

1
yum install pam-devel
× 请我吃糖~
打赏二维码