Centos7学习笔记(八)-基础命令(三)

1、rsync

作为一个同步(备份,增量备份)命令,它的选项非常的多,常用的组合是avz,当然,如果需要建立备份服务,那么-n必然是用的多的参数选项。

关于rsync的用法详细说明,参考网上的这篇原文链接:https://www.cnblogs.com/f-ck-need-u/p/7220009.html#blog21,文章写的非常好,有大量的通俗易懂的例子及解释。以下关于rsync参数选项的说明,就抄录自该文章。

v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。
-n --dry-run  :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive  :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新
          :检查出mtime不同从而导致增量传输无效。-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D        :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z        :传输时进行压缩提高效率。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
--size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
-d --dirs   :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
--max-size  :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m")
--min-size  :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
--exclude   :指定排除规则来排除不需要传输的文件。
--delete    :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在
            :exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e          :指定所要使用的远程shell程序,默认为ssh。
--port      :连接daemon时使用的端口号,默认为873端口。
--password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
--existing  :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。
--remove-source-files:要求删除源端已经成功传输的文件。
--bwlimit=KBps   限定rsync传输带宽,单位是KB

 

2、scp

scp是基于ssh的安全拷贝命令(security copy),它是从古老的远程复制命令rcp改变而来,实现的是在host与host之间的拷贝,可以是本地到远程的、本地到本地的,甚至可以远程到远程复制。注意,scp可能会询问密码。

如果scp拷贝的源文件在目标位置上已经存在时(文件同名),scp会替换已存在目标文件中的内容,但保持其inode号。

如果scp拷贝的源文件在目标位置上不存在,则会在目标位置上创建一个空文件,然后将源文件中的内容填充进去。

之所以解释上面的两句,是为了理解scp的机制,scp拷贝本质是只是填充内容的过程,它不会去修改目标文件的很多属性,对于从远程复制到另一远程时,其机制见后文。

scp [-12BCpqrv] [-l limit] [-o ssh_option] [-P port] [[user@]host1:]file1 ... [[user@]host2:]file2

选项说明:

-1:使用ssh v1版本,这是默认使用协议版本

-2:使用ssh v2版本

-C:拷贝时先压缩,节省带宽

-l limit:限制拷贝速度,Kbit/s.

-o ssh_option:指定ssh连接时的特殊选项,一般用不上。偶尔在连接过程中等待提示输入密码较慢时,可以设置GSSAPIAuthentication为no

-P port:指定目标主机上ssh端口,大写的字母P,默认是22端口

-p:拷贝时保持源文件的mtime,atime,owner,group,privileges

-r:递归拷贝,用于拷贝目录。注意,scp拷贝遇到链接文件时,会拷贝链接的源文件内容填充到目标文件中(scp的本质就是填充而非拷贝)

-v:输出详细信息,可以用来调试或查看scp的详细过程,分析scp的机制

 

3、su

作用是切换用户,常用的方式是不加任何参数或者加-作为参数。下面是详细解释:

选项说明:

-c command:使用-c指定要在shell执行的命令,会为每个su都分配新的会话环境

-, -l, --login:启动shell作为登录的shell,模拟真正的登录环境。它会做下面几件事:

       1.清除除了TERM外的所有环境变量

       2.初始化HOME,SHELL,USER,LOGNAME,PATH环境变量

       3.进入目标用户的家目录

       4.设置argv[0]为"-"以便设置shell作为登录的shell。使用--login的su是交互式登录。不使用--login的su是非交互式登录(除不带任何参数的su外)

-m, -p, --preserve-environment:

       保留整个环境变量(不会重新设置HOME,SHELL,USER和LOGNAME),保留环境的方法是新用户shell上执行原用户的各配置文件,如~/.bashrc当设置了--login时,将忽略该选项

-s SHELL:运行指定的shell而非默认shell,选择shell的顺序优先级如下:

       1.--shell指定的shell

       2.如果使用了--preserve-environment,选择SHELL环境变量的shell

       3.选项目标用户在passwd文件中指定的shell

       4./bin/sh

 

4、sudo

sudo可以让一个用户以某个身份(如root或其他用户)执行某些命令,它隐含的执行方式是切换到指定用户再执行命令,因为涉及到了用户的切换,所以环境变量是否重置是需要设置的。

sudo支持插件实现安全策略。默认的安全策略插件是sudoers,它是通过/etc/sudoers或LDAP来配置的。

安全策略是控制用户使用sudo命令时具有什么权限,但要注意,安全策略可能需要用户进行身份认证,如密码认证的机制或其他认证机制,如果开启了认证要求,则在指定时间内未完成认证时sudo会退出,默认超时时间为5分钟。

安全策略支持对认证进行缓存,使得在一定时间内该用户无需再次认证就可以执行sudo命令,默认缓存时间为5分钟,sudo -v可以更新认证缓存。

sudo支持日志审核,可以记录下成功或失败的sudo。

$ visudo     # 以下选取的是部分行

## hostname or IP addresses instead.   # 主机别名Host_Alias
# Host_Alias     FILESERVERS = fs1, fs2
# Host_Alias     MAILSERVERS = smtp, smtp2
## User Aliases           # 用户别名User_Alias
# User_Alias ADMINS = jsmith, mikem
## Command Aliases        # 命令别名
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
# Cmnd_Alias LOCATE = /usr/bin/updatedb
 
root    ALL=(ALL)       ALL   # sudo权限的配置
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

 

安全策略配置格式为:

用户名     主机名=(可切换到的用户身份)         权限和命令

①               ②               ③                                   ④

 

①用户名:可以用组,只需在组名前加个百分号%表示。

②主机名:表示该用户可以在哪些主机上运行sudo,可以用hostname也可以用ip指定。

③可切换的用户身份,即指定执行命令的用户,也可以用组。

④权限和命令:允许执行和不允许执行的命令(多个命令间用逗号分隔)和特殊权限,命令可以带其选项及参数。命令要写绝对路径。不允许执行的命令需要在命令前加上”!”来表示。可以使用标签,如NOPASSWD标签表示切换或以指定用户执行该标签后的命令时不需要输入密码。一行写不下时可使用\续行

一个例子:

DEFAULT=/bin/*,\
        /usr/bin/*,\
        /bin/su - [!-]*,\
        !/bin/su - root,\
        !/bin/su root, \
        /sbin/ldconfig,\
        /sbin/ifconfig,\
        /sbin/service,\
        /sbin/chkconfig,\
        /usr/sbin/useradd,\
        /usr/sbin/userdel,\
        /usr/sbin/dmidecode, \
        /usr/sbin/lsof, \
        /usr/bin/passwd [!-]*,\
        !/usr/bin/passwd root,\
        sudoedit /etc/rc.local,\
        sudoedit /etc/hosts,\
        sudoedit /etc/ld.so.conf,\
        sudoedit /etc/exports,\
        sudoedit /etc/profile,\
        sudoedit /etc/bashrc,\
        sudoedit /etc/security/limits.conf,\
        /etc/init.d/*
ABC ALL=(ALL)NOPASSWD:DEFAULT

其中上面的/usr/bin/passwd [!-]*表示允许修改加参数的密码。/bin/su - [!-]*表示允许”su -“到某用户下,但必须给参数。

 

5、umask

umask值用于设置用户在创建文件时的默认权限。对于root用户(实际上是UID小于200的user),系统默认的umask值是022;对于普通用户和系统用户,系统默认的umask值是002。

默认它们的设置是写在/etc/profile和/etc/bashrc两个环境配置文件中。

 

umask是如何决定创建文件的默认权限的呢?

 

如果创建的是目录,则使用777-umask值,如root的umask=022,则root创建目录时该目录的默认权限为777-022=755,而普通用户创建目录时,权限为777-002=775.

如果创建的是普通文件,在Linux中,深入贯彻了一点:文件默认不应该有执行权限,否则是危险的。所以在计算时,可能会和想象中的结果不一样。如果umask的三位都为偶数,则直接使用666去减掉umask值,因为6减去一个偶数还是偶数,任何位都不可能会有执行权限。如root创建普通文件时默认权限为666-022=644,而普通用户创建普通文件时默认权限为666-002=664。

 

如果umask值某一位为奇数,则666减去umask值后再在奇数位上加1。如umask=021时,创建文件时默认权限为666-021=645,在奇数位上加1,则为646。总之计算出后默认都是没有执行权限的。

 

6、setfacl(用于精细化或者独立设置用户对目录权限,ftp或者NFS服务多用它)

setfacl [options] u:[用户列表]:[rwx] 目录/文件名    # 对用户设置使用u

setfacl [options] g:[组列表]:[rwx]   目录/文件名    # 对组设置使用g

 

选项说明:

-m:设定ACL权限(modify)

-x:删除指定的ACL权限,可以指定用户、组和文件来删除(remove)

-M:写了ACL条目的文件,将从此文件中读取ACL条目,需要配合-m,所以-M指定的是modify file

-X:写了ACL条目的文件,将从此文件中读取ACL条目,需要配合-x,所以-X指定的是remove file

-n:不重置mask

-b:删除所有的ACL权限

-d:设定默认ACL权限,只对目录有效,设置后子目录(文件)继承默认ACL,只对未来文件 有效

-k:删除默认ACL权限

-R:递归设定ACL权限,只对目录有效,只对已有文件有效

查看使用getfacl命令

 

7、chattr

chattr [+ - =] [ai] 文件或目录名

常用的参数是a(append,追加)和i(immutable,不可更改),其他参数略。

设置了a参数时,文件中将只能增加内容,不能删除数据,且不能打开文件进行任何编辑,哪怕是追加内容也不可以,所以像sed等需要打开文件的再写入数据的工具也无法操作成功。文件也不能被删除。只有root才能设置。

设置了i参数时,文件将被锁定,不能向其中增删改内容,也不能删除修改文件等各种动作。只有root才能设置。可以将其理解为设置了i后,文件将是永恒不变的了,谁都不能动它。

 

8、关于suid、sgid和sbit

suid只针对可执行文件,即二进制文件。它的作用是对某个命令(可执行文件)授予所有者的权限,命令执行完成权限就消失。一般是提权为root权限。

suid必须和x配合,如果没有x配合,则该suid是空suid,仍然没有执行命令的权限,所有者都没有了x权限,suid依赖于它所以更不可能有x权限。空的suid权限使用大写的”S”表示。

数字4代表suid,如4755。文件加suid方式,chmod u+s xxx。

 

sgid

针对二进制文件和目录。

针对二进制文件时,权限升级为命令的所属组权限。

针对目录时,目录中所建立的文件或子目录的组将继承默认父目录组,其本质还是提升为目录所属组的权限。此时目录应该要有rx权限,普通用户才能进入目录,如果普通用户有w权限,新建的文件和目录则以父目录组为默认组。

以2代表sgid,如2755,和suid组合如6755。组或目录增加sgid方式:  chmod g+s xxx

 

sbit

只对目录有效。对目录设置sbit,将使得目录里的文件只有所有者能删除,即使其他用户在此目录上有rwx权限,即使是root用户。

以1代表sbit。chmod o+t xxx

 

9、chage

看这么个例子:

useradd -o -u 0 -e "10 day" jtest             #《========= -o表示允许添加uid相同的用户

[root@ecs-ryCz8 ~]# chage -l jtestLast password change: Aug 20, 2020Password expires: Nov 18, 2020Password inactive: neverAccount expires: Aug 30, 2020Minimum number of days between password change: 10Maximum number of days between password change: 90Number of days of warning before password expires: 7

chge -l 列出用户密码或时间相关内容。

-E能将修改用户账户过期时间。

 

10、netstat

-a ——显示所有活动连接

-n——以数字形式显示

-t——查看tcp协议相关信息

-u——查看udp协议相关信息

-l——监听

-p——查看pid和进程名

 

11、lsof

几乎可以替代netstat和ps的命令,字面意思是list open file,列出打开的文件。

  • 默认 : 没有选项,lsof列出活跃进程的所有打开文件

  • 组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数

  • -a : 结果进行“与”运算(而不是“或”)

  • -l : 在输出显示用户ID而不是用户名

  • -h : 获得帮助

  • -t : 仅获取进程ID

  • -U : 获取UNIX套接口地址

  • -F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)

  • -i 显示所有的连接

  • -p 列出指定pid的信息

     

     

关于-i:

语法: lsof -i[46] [protocol][@hostname|hostaddr][:service|port]

-i 6仅获取IPv6流量

lsof -i 6

仅显示TCP连接(同理可获得UDP连接)

lsof -iTCP

使用-i:port来显示与指定端口相关的网络信息

lsof -i :22

使用@host来显示指定到指定主机的连接

lsof -i@172.16.1.24

使用@host:port显示基于主机与端口的连接

lsof -i@172.16.1.24:22

找出监听端口

lsof -i -sTCP:Listen

找出已建立的连接

lsof -i -sTCP:ESTABLISHED

使用-u显示指定用户打开了什么

lsof -u nginx

杀死指定用户所做的一切事情

kill -9 `lsof -u nginx`

使用-c查看指定的命令正在使用的文件和网络连接

lsof  -c syslog-ng

显示与指定目录交互的所有一切

lsof  /var/log/messages/

显示与指定文件交互的所有一切

lsof /etc/ssh/sshd_config

同时使用-t和-c选项以给进程发送 HUP 信号

kill  -HUP `lsof -t -c sshd`

 

lsof输出部分的解释:

每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。

lsof输出各列信息的意义如下:

COMMAND:进程的名称 PID:进程标识符

USER:进程所有者

FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等

DEVICE:指定磁盘的名称

SIZE:文件的大小

NODE:索引节点(文件在磁盘上的标识)

NAME:打开文件的确切名称

FD 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改,txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。

其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。u 表示该文件被打开并处于读取/写入模式,而不是只读 ® 或只写 (w) 模式。同时还有大写 的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。

与 FD 列相比,Type 列则比较直观。文件和目录分别称为 REG 和 DIR。而CHR 和 BLK,分别表示字符和块设备;或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。

 

12、nmap

-sP——探测某网段内有哪些主机是存活的

-sT——探测某主机开启了哪些TCP端口

// 查看全文
2020 8月 19

Centos7学习笔记(七)— 性能调优一

1、nice,renice  调整进程nice值,让进程使用更多的CPU

nice值   #范围,  -20 ~ 19  越小优先级越高 普通用户0-19

作用:以什么优先级运行进程 。默认优先级是0

语法: nice  -n 优先级数字   命令

例:

# nice -n -5 vim a.txt   # vim进程以-5级别运行

查看:

ps -axu | grep a.txt

[root@xuegod63 ~]# ps -axu | grep a.txt

root     24318  0.0  0.2 143624  3280 pts/4    S+   17:00   0:00 vim b.txt

[root@xuegod63 ~]# top -p   24318

 

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                        

        24129 root      15  -5  140m 3336 2200 S  0.0  0.3   0:00.08 vim

 

renice  #修改正在运行的进程的优先级

#renice -n 5 PID   #修改进程优先级

例:

#renice -n 5 24318

[root@xuegod63 ~]# top -p   24318

 

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                       

24129 root      15  5  140m 3336 2200 S  0.0  0.3   0:00.08 vim


2、taskset 

语法: taskset  -c N 命令

taskset 作用:在多核情况下,可以认为指定一个进程在哪颗CPU上执行程序,减少进程在不同CPU之前切换的开销

 

例1:本机是4核CPU ,指定vim命令在第一个CPU上运行

[root@xuegod63 ~]# taskset -c 0 vim a.txt    #1号CPU ID是0

[root@xuegod63 ~]# ps -axu | grep vim

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

root      2614  1.3  0.2 143696  3332 pts/0    S+   18:39   0:00 vim a.txt

[root@xuegod63 ~]# taskset -p  2614    #  -p 要查看的进程ID

pid 2614's current affinity mask: 1    #CPU亲和力掩码,1代表第一个CPU核心

 

例2:查sshd进程运行在哪几个CPU上

[root@xuegod63 ~]# ps -axu | grep sshd

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

root      2030  0.0  0.0  64068  1140 ?        Ss   18:26   0:00 /usr/sbin/sshd

 [root@xuegod63 ~]# taskset -p 2030

pid 2030's current affinity mask: f   #说明sshd在4颗CPU上随机进行切换

 

说明: 
       Cpu ID 号码,对应的16进制数为: 
       CPU ID:               7      6      5      4      3      2      1      0
       对应的10数为:        128   64     32    16      8      4      2      1

pid 2030's current affinity mask: f的值为cpu ID 16进制的值的和(1+2+4+8=f),转换成二进制为:1111 

这个说明了(pid=2030)的这个sshd进程工作在cpu ID 分别为0,1,2,3这个四个cpu上面的切换。

 

例:指定vim c.txt  程序运行在第2和第4个CPU上

[root@xuegod63 ~]#  taskset -pc 1,3 vim b.txt

[root@xuegod63 ~]#  ps -axu | grep vim

root      6314  1.5  0.2 143612  3280 pts/1    S+   14:41   0:00 vim b.txt

root      6317  0.0  0.0 103300   848 pts/2    S+   14:41   0:00 grep vim

[root@xuegod63 ~]# taskset -p    6314

pid 6314's current affinity mask: a

 

3、vmstat

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。

一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

root@ubuntu:~# vmstat 2 1
root@ubuntu:~# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 3498472 315836 3819540    0    0     0     1    2    0  0  0 100  0

 

2表示每个两秒采集一次服务器状态,1表示只采集一次。

r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

b 表示阻塞的进程,这个不多说,进程阻塞,     大家懂的。

swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

free   空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

buff   Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M

cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

so  每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

bi  块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

in 每秒CPU的中断次数,包括时间中断

cs (context switches)每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。

sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

id  空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

wt 等待IO CPU时间。

 

4、内存优化

主要是清理buffer和cache

说一下buffer和cache的区别

buffer   inode节点索引缓存               缓存(缓冲)   通常意义上说,是写时用,先写入内存

cache    block 块/页缓存                   快取,  读时用,先读入到内存

为了理解这一点,可以用dd命令生成一个2G的文件,用free -m查看cache的变化(centos6下)

[root@study6 ~]# dd if=/dev/zero of=/home/test bs=4096 count=500000
500000+0 records in
500000+0 records out
2048000000 bytes (2.0 GB) copied, 2.10772 s, 972 MB/s

[root@study6 ~]# free -h                #《========dd执行前(已清理buffer和cache)  
            total       used       free     shared    buffers     cached
Mem:          979M       123M       856M       192K       812K       6.4M 
-/+ buffers/cache:       116M       863M
Swap:         2.0G         0B       2.0G
[root@study6 ~]# free -h                  #《=======dd执行后
            total       used       free     shared    buffers     cached
Mem:          979M       909M        70M       192K       604K       771M
-/+ buffers/cache:       137M       841M
Swap:         2.0G         0B       2.0G

因为是生成大文件,需要占用大量block,那么cache必然急速上升(6.4m变到771m)。这个生成文件的过程,跟常规比如nginx提供web服务,需要从磁盘读取大量不同的文件相反,此时,cache值也是升高的。

相反,用 find /来查找根目录下所有文件,是一个读取的过程,可以观测buffer值的变化

[root@study6 ~]# free -h                                  
             total       used       free     shared    buffers     cached
Mem:          979M       121M       857M       192K        56K       6.5M

#《==========   find / 执行前,buffers是56K
-/+ buffers/cache:       115M       864M
Swap:         2.0G         0B       2.0G

[root@study6 ~]# free -h
             total       used       free     shared    buffers     cached   

#《============  find /执行后,buffers是16M  
Mem:          979M       153M       826M       192K        16M       7.2M
-/+ buffers/cache:       129M       849M
Swap:         2.0G         0B       2.0G

下面说一下 drop_caches:
清空 pagecache:
sync
echo 1 > /proc/sys/vm/drop_caches

 

清空 dentries 和 inodes:
sync
echo 2 > /proc/sys/vm/drop_caches

 

清空所有缓存(pagecache、dentries 和 inodes):
sync
echo 3 > /proc/sys/vm/drop_caches

 

5、ulimit

ulimit为shell内建指令,可用来控制shell执行程序的资源。(注意:ulimit的设定只对当前shell生效)

 

语法

ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小>][-t <CPU时间>][-u <程序数目>][-v <虚拟内存大小>]

参数

  • -a  显示目前资源限制的设定。

  • -c <core文件上限>  设定core文件的最大值,单位为区块。

  • -d <数据节区大小>  程序数据节区的最大值,单位为KB。

  • -f <文件大小>  shell所能建立的最大文件,单位为区块。

  • -H  设定资源的硬性限制,也就是管理员所设下的限制。

  • -m <内存大小>  指定可使用内存的上限,单位为KB。

  • -n <文件数目>  指定同一时间最多可开启的文件数。

  • -p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。

  • -s <堆叠大小>  指定堆叠的上限,单位为KB。

  • -S  设定资源的弹性限制。

  • -t <CPU时间>  指定CPU使用时间的上限,单位为秒。

  • -u <程序数目>  用户最多可开启的程序数目。

  • -v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。

查看系统用户所有限制值:ulimit -a

[root@studylinux ~]#ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15643
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15643
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

设置用户open files(用户可以打开文件的最大数目):ulimit -n 4096。执行该命令非root用户只能设置到4096。想要设置到8192需要sudo权限或者root用户。

查看当前系统打开的文件数量: lsof | wc -l  
查看当前进程的打开文件数量:lsof -p pid | wc -l      (lsof -p 1234 | wc -l  )

查看当前进程的最大可以打开的文件数:cat /proc/PID/limits  (如果通过ulimit -n 设置或者修改/etc/security/limits.conf,看看进程是否生效)  

查看系统总限制打开文件的最大数量:cat /proc/sys/fs/file-max

lsof只能以root权限执行。在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

ulimit要想永久生效,需要针对/etc/security/limits.conf文件进行修改,并系统重启。

/etc/security/limits.conf文件中,已经明确了其内容格式的写法。以下是对domain、type、resource具体值的解释:

 

domain:username|@groupname:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。

type:有 soft,hard 和 -,soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的最大值不能超过hard的值。用 – 就表明同时设置了 soft 和 hard 的值。

resource:

    core – 限制内核文件的大小
    date – 最大数据大小
    fsize – 最大文件大小
    memlock – 最大锁定内存地址空间
    nofile – 打开文件的最大数目
    rss – 最大持久设置大小
    stack – 最大栈大小
    cpu – 以分钟为单位的最多 CPU 时间
    noproc – 进程的最大数目(系统的最大进程数)
    as – 地址空间限制
   maxlogins – 此用户允许登录的最大数目

   要使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。

   查看 /etc/pam.d/login 文件中有:

   session required /lib/security/pam_limits.so

 

需要注意一点:/etc/security/limits.d下也有noproc最大进参数的限制(文件20-nproc.conf(CentOS7)或者90-nproc.conf(Centos6)):

即 /etc/security/limits.d/下的文件覆盖了/etc/security/limits.conf设置的值 

*          soft    nproc     4096(这个是CentOS7默认C6是1024)

 

对于文件描述符的配置,需要注意以下几点:

所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max

  • 单个进程打开的文件描述符数不能超过user limit中nofile的soft limit

  • nofile的soft limit不能超过其hard limit

  • nofile的hard limit不能超过/proc/sys/fs/nr_open

  •  

6、bonding

CentOS7下创建网卡绑定bond(主备模式)

A)nmcli connection delete eth0

nmcli connection delete eth1           #《========需要删除被绑定网卡的配置信息

B)nmcli connection add type bond ifname bond0 con-name bond0 miimon 100 mode active-backup primary eth0 ipv4.addresses 192.168.205.129/24                      #《======添加bond网卡类型,并指定ifname、con-name、miimon以及mode类型

说明:ifname ——指定bond的内核名称

con-name——指定bond的链接名称

miimon——指定MII链路监控频率,单位是毫秒(ms)。这将决定驱动检查每个slave链路状态频率。0表示禁止MII链路监控。100可以作为一个很好的初始参考值

mode——bond的模式类型

primary——主备模式下指定主接口

ipv4.address——指定bond的ipv4地址

C)nmcli connection add type bond-slave ifname eth0 con-name bond0-p1 master bond0

nmcli connection add type bond-slave ifname eth1 con-name bond0-p2 master bond0           #《=========将两个物理网卡分别添加为bond-slave并指定ifname、con-name以及master为谁

D)nmcli connection up bond0-p1

nmcli connection up bond0-p2                #《============激活2个物理网卡

激活后,bond0的ip地址,会从primary指定的接口原有配置信息获取。

E)查看bond信息

 

cat  /proc/net/bonding/bond0 

Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eth0 (primary_reselect always)
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d1:aa:30
Slave queue ID: 0
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d1:aa:3a
Slave queue ID: 0

[root@studylinux /etc/sysconfig/network-scripts]#ifconfig 
bond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST>  mtu 1500
        inet 192.168.205.129  netmask 255.255.255.0  broadcast 192.168.205.255
        inet6 fe80::d731:5ba9:dc7d:759  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d1:aa:30  txqueuelen 1000  (Ethernet)
        RX packets 58  bytes 4046 (3.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16  bytes 1736 (1.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
eth0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
        ether 00:0c:29:d1:aa:30  txqueuelen 1000  (Ethernet)
        RX packets 1140  bytes 81478 (79.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 290  bytes 37400 (36.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
eth1: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
        ether 00:0c:29:d1:aa:30  txqueuelen 1000  (Ethernet)
        RX packets 2297  bytes 165294 (161.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1154  bytes 119584 (116.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

关于mode模式,bond有7种模式:(可以用命令tab出来)

nmcli connection add type bond ifname bond1 con-name bond1 mode 

802.3ad        balance-alb    balance-tlb    broadcast      active-backup  balance-rr     balance-xor    

Mode=0(balance-rr) 表示负载分担round-robin,和交换机的聚合强制不协商的方式配合
Mode=1(active-backup) 表示主备模式,只有一块网卡是active,另外一块是备的standby
Mode=2(balance-xor) 表示XOR Hash负载分担,和交换机的聚合强制不协商方式配合。(需要xmit_hash_policy)
Mode=3(broadcast) 表示所有包从所有interface发出,这个不均衡,只有冗余机制和交换机的聚合强制不协商方式配合
Mode=4(802.3ad) 表示支持802.3ad协议,和交换机的聚合LACP方式配合(需要xmit_hash_policy)
Mode=5(balance-tlb) 是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave
Mode=6(balance-alb) 在5的tlb基础上增加了rlb。
5和6不需要交换机端的设置,网卡能自动聚合。4需要支持802.3ad。0,2和3理论上需要静态聚合方式

实测中0可以通过mac地址欺骗的方式在交换机不设置的情况下不太均衡地进行接收
常用的有三种
mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。(思科设备要做etherchannel、foundry要做portgroup)
mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。
mode=6:平衡负载模式,有自动备援,不必”Switch”支援及设定。

http://www.mamicode.com/info-detail-2795052.html关于 mode有详细介绍。

https://www.cnblogs.com/hukey/p/6224969.html有介绍关于bond的team类型

 

7、内核优化

关于内核优化,有很多参数,其中,重要的一个是防止syn flood攻击。以下参数内容及解释,收集至互联网。

#系统所有进程一共可以打开的文件数量    *****
fs.file-max = 2097152
# 减少交换内存使用,默认60,建议10-30
vm.swappiness = 30
# 脏数据的比例和处理,根据场景不同设置,
# 参考 https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/
# 如果是数据库服务器,希望数据能够尽快安全写入,可降低内存缓存比例
# vm.dirty_background_ratio = 5
# vm.dirty_ratio = 10
 
# 如果是业务服务器,对数据安全写入无要求,可加大内存缓存比例
# vm.dirty_background_ratio = 50
# vm.dirty_ratio = 80
# 设置为1,内核允许分配所有的物理内存,Redis常用
vm.overcommit_memory = 1
 
# 系统拥有的内存数,ElasticSearch启动必备
vm.max_map_count = 26214
# 一个tcp连接关闭后,把这个连接曾经有的参数比如慢启动门限snd_sthresh,拥塞窗口snd_cwnd 还有srtt等信息保存到dst_entry中, 只要dst_entry 没有失效,下次新建立相同连接的时候就可以使用保存的参数来初始化这个连接
net.ipv4.tcp_no_metrics_save = 1
# 使用sysrq组合键是了解系统目前运行情况,为安全起见设为0关闭    ****
kernel.sysrq = 0
 
# 控制 core 文件的文件名中是否添加 pid 作为扩展
kernel.core_uses_pid = 1
  
# 开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理   ****
net.ipv4.tcp_syncookies = 1
 
# 消息队列的最大消息大小,默认8k,建议64kb      ****
kernel.msgmax = 65536
# 消息队列存放消息的总字节数               ****
kernel.msgmnb = 163840
 
# TIME_WAIT socket的最大数目,不宜太大或者太小,默认是180000,nginx反向代理必备   ****
net.ipv4.tcp_max_tw_buckets = 50000
# 开启有选择的应答,设置为1           ****
net.ipv4.tcp_sack = 1
# 支持更大的TCP窗口. 如果TCP窗口最大超过65535(64K), 必须设置该数值为1       ****
net.ipv4.tcp_window_scaling = 1
  
# TCP 缓冲区内存,连接数达到非常高时候需要配置好; 1st低于此值,TCP没有内存压力,2nd进入内存压力阶段,3rdTCP拒绝分配socket(单位:内存页)
net.ipv4.tcp_mem = 786432 2097152 3145728     ###(该值应该是按8G内存计算得来)
#TCP读buffer 
net.ipv4.tcp_rmem = 4096 4096 16777216
#TCP写buffer
net.ipv4.tcp_wmem = 4096 4096 16777216
 
#为TCP socket预留用于发送缓冲的内存默认值(单位:字节)
net.core.wmem_default = 8388608              #(系统默认值:124928)
#为TCP socket预留用于接收缓冲的内存默认值(单位:字节)
net.core.rmem_default = 8388608                #(系统默认值:124928)
#为TCP socket预留用于接收缓冲的内存最大值(单位:字节)
net.core.rmem_max = 16777216                   #(系统默认值:124928)
#为TCP socket预留用于发送缓冲的内存最大值(单位:字节)
net.core.wmem_max = 16777216                        #(系统默认值:124928)
  
# ACCEPT等待队列长度,适当,太大了堆积也无用;每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目    ****
net.core.netdev_max_backlog = 65535
 
# 不属于任何进程的socket数目,不宜太大,防止攻击; 系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)
net.ipv4.tcp_max_orphans = 65535
  
# SYNC等待队列长度,适当,太大了排队也没用; 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128
net.ipv4.tcp_max_syn_backlog = 8192
  
# 禁用timestamp,重要,高并发下设置为0; 时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉    ****
net.ipv4.tcp_timestamps = 0
  
# 发送 SYNC+ACK 的重试次数,不宜太大,5以内; 为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量      ****
net.ipv4.tcp_synack_retries = 1
# 发送SYNC的重试次数,不宜太大,5以内     ****
net.ipv4.tcp_syn_retries = 1
  
# 允许回收TCP连接,重要,必须为1; 开启TCP连接中time_wait sockets的快速回收     ****
net.ipv4.tcp_tw_recycle = 1
 
# 允许重用TCP连接,重要,必须为1; 开启TCP连接复用功能,允许将time_wait sockets重新用于新的TCP连接(主要针对time_wait连接) ****
net.ipv4.tcp_tw_reuse = 1
  
# 服务端主动关闭后,客户端释放连接的超时,重要,<30; 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些      ****
net.ipv4.tcp_fin_timeout = 5
 
# 允许TCP保持的空闲keepalive时长,不需要太长    ****
net.ipv4.tcp_keepalive_time = 30
  
# 系统作为TCP客户端连接自动使用的端口(start,end),可发起并发连接数为end-start          ****
net.ipv4.ip_local_port_range = 10240 65535
#web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值             ****
net.core.somaxconn = 16384
 
#禁用包过滤功能 
net.ipv4.ip_forward = 0 
#启用源路由核查功能 
net.ipv4.conf.default.rp_filter = 1  
#禁用所有IP源路由 
net.ipv4.conf.default.accept_source_route = 0    
#单个共享内存段的大小(单位:字节)限制,计算公式64G*1024*1024*1024(字节)
kernel.shmmax = 68719476736  
#所有内存大小(单位:页,1页 = 4Kb),计算公式16G*1024*1024*1024/4KB(页)
kernel.shmall = 4294967296
 
#当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可以更快的清理无效链接。      
ner.ipv4.tcp_keepalive_time = 600

 

 

 

 

 

 

 

// 查看全文
2020 8月 18