生产环境服务器安全策略与系统性能优化评估
生产环境服务器安全策略与系统性能优化评估
1. linux的运维经验分享与故障排查思路
1.1 线上服务器安装基本策略和经验
精简安装策略:
- 仅安装需要的,按需安装,不用不装
- 开发包,基本网络包,基本应用包
1.1.1 centos-6.x
1.1.2 centos-7.x
盘系统-默认按照分区方式
数据盘单独挂载
1.2 线上服务器网络设置经验和技巧
1.2.1 centos7.x下最好关闭的服务
#关闭networkmanager服务,并关闭开机启动 [root@yangwenbo ~]# systemctl stop networkmanager [root@yangwenbo ~]# systemctl disable networkmanager removed symlink /etc/systemd/system/multi-user.target.wants/networkmanager.service. removed symlink /etc/systemd/system/dbus-org.freedesktop.networkmanager.service. removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service. [root@yangwenbo ~]# systemctl status networkmanager ● networkmanager.service - network manager loaded: loaded (/usr/lib/systemd/system/networkmanager.service; disabled; vendor preset: enabled) active: inactive (dead) since mon 2018-10-08 02:01:14 edt; 18s ago docs: man:networkmanager(8) main pid: 1299 (code=exited, status=0/success) cgroup: /system.slice/networkmanager.service └─1344 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens32.pid -lf...
如果不关闭此服务,那么此服务会接管的linux的网络设置。有时候会导致修改了网卡配置文件ip,但是网卡的ip不变的情况
开启networkmanager服务,打开开机自启动的命令 [root@yangwenbo ~]# systemctl start networkmanager [root@yangwenbo ~]# systemctl enable networkmanager
1.2.2 关于dns的设置
(1)临时修改dns设置,修改立即生效,重启服务器或重启网络后恢复
[root@yangwenbo ~]# cat /etc/resolv.conf ; generated by /usr/sbin/dhclient-script search localdomain nameserver 192.168.200.2 #修改此条配置,dns即可被修改。立即生效
修改的/etc/resolv.conf文件里的域名服务器,dns即可被修改,生效立刻
但是重启网络或者重启服务器的/etc/resolv.conf里的域名服务器设置会被网卡配置文件的设置覆盖
[root@yangwenbo ~]# vim /etc/resolv.conf [root@yangwenbo ~]# cat /etc/resolv.conf ; generated by /usr/sbin/dhclient-script search localdomain nameserver 192.168.200.3 #修改了此行配置 [root@yangwenbo ~]# systemctl restart network #中间有可能会掉线 [root@yangwenbo ~]# cat /etc/resolv.conf ; generated by /usr/sbin/dhclient-script search localdomain nameserver 192.168.200.2 #配置还原了
(2)永久修改dns设置
[root@yangwenbo ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32 type=ethernet bootproto=static device=ens32 onboot=yes nm_controlled=yes ipaddr=192.168.200.141 netmask=255.255.255.0 gateway=192.168.200.2 dns1=192.168.200.2 #永久修改需要修改网卡配置文件本行 dns2=202.106.0.20
1.2.3 关于服务器自身主机名的修改
centos7.x
#永久修改主机名 [root@yangwenbo ~]# cat /etc/hostname localhost.localdomain [root@yangwenbo ~]# vim /etc/hostname [root@yangwenbo ~]# cat /etc/hostname centos7.5 [root@yangwenbo ~]# hostname centos7.5 [root@yangwenbo ~]# bash [root@centos7 ~]#
1.2.4 关于服务器对自身主机名的映射
#映射服务器自身的主机名 [root@centos7 ~]# echo "127.0.0.1 centos7" >> /etc/hosts [root@centos7 ~]# tail -1 /etc/hosts 127.0.0.1 centos7
请注意服务器映射自己的主机名,务必映射为127.0.0.1不要映射成网卡的ip 这是因为很多服务的运行都要验证自身的主机名是否被映射,不然会导致未知的故障
1.3 线上服务器selinux,iptables策略设置
1.3.1 selinux配置(如何关闭selinux)
[root@centos7 ~]# sestatus selinux status: enabled #以下省略。。。 #永久关闭selinux开机自启动 [root@centos7 ~]# cat /etc/selinux/config # this file controls the state of selinux on the system. # selinux= can take one of these three values: # enforcing - selinux security policy is enforced. # permissive - selinux prints warnings instead of enforcing. # disabled - no selinux policy is loaded. selinux=disabled #当然selinux开启自启动不能(enforcing开启;disabled关闭) # selinuxtype= can take one of three two values: # targeted - targeted processes are protected, # minimum - modification of targeted policy. only selected processes are protected. # mls - multi level security protection. selinuxtype=targeted #临时关闭selinux [root@centos7 ~]# setenforce 0
1.3.2 iptables配置
如果我们的机房没有硬件防火墙的话,那么我们必须通过的iptables对拥有公网网卡的服务器做安全
#防火墙配置文件/etc/sysconfig/iptables #推荐配置 iptables -p input accept iptables -f iptables -a input -p tcp -m tcp --dport 80 -j accept iptables -a input -s 1.1.1.0/24 -p tcp -m tcp --dport 22 -j accept iptables -a input -s 2.2.2.2/32 -p tcp -m tcp --dport 22 -j accept iptables -a input -i eth1 -j accept iptables -a input -i lo -j accept iptables -a input -m state --state related,established -j accept iptables -a input -p tcp -m tcp --tcp-flags fin,syn,rst,psh,ack,urg none -j drop iptables -a input -p tcp -m tcp --tcp-flags fin,syn fin,syn -j drop iptables -a input -p tcp -m tcp --tcp-flags syn,rst syn,rst -j drop iptables -a input -p tcp -m tcp --tcp-flags fin,rst fin,rst -j drop iptables -a input -p tcp -m tcp --tcp-flags fin,ack fin -j drop iptables -a input -p tcp -m tcp --tcp-flags psh,ack psh -j drop iptables -a input -p tcp -m tcp --tcp-flags ack,urg urg -j drop iptables -p input drop iptables -p output accept iptables -p forward drop
1.4 线上服务器ssh登陆安全策略
1.4.1 ssh登陆策略
(1)登陆策略
[root@centos7 ~]# cp /etc/ssh/sshd_config{,.bak} #备份 #修改前 [root@centos7 ~]# cat -n /etc/ssh/sshd_config | sed -n '17p;38p;43p;47p;65p;79p;115p' 17 #port 22 #修改ssh连接端口 38 #permitrootlogin yes #是否允许root账号远程登陆 43 #pubkeyauthentication yes #是否开启公钥连接认证 47 authorizedkeysfile .ssh/authorized_keys #公钥文件的放置位置 65 passwordauthentication yes #是否开启密码验证登陆 79 gssapiauthentication yes #是否关闭gssapi认证 115 #usedns yes #是否关闭dns反向解析 #修改后 [root@centos7 ~]# cat -n /etc/ssh/sshd_config | sed -n '17p;38p;43p;47p;65p;79p;115p' 17 port 22221 #工作中需要设定到1万以上的端口,避免被扫描出来。 38 permitrootlogin yes #如果不是超大规模的服务器,为了方便我们可以暂时开启root远程登录 43 pubkeyauthentication yes #开启公钥认证模式 47 authorizedkeysfile .ssh/authorized_keys #公钥放置位置 65 passwordauthentication no #因为我们开启了root远程登录,因此为了安全我们关闭密码认证的方式 79 gssapiauthentication no #关闭gssapi认证,极大提高ssh连接速度 115 usedns no #关闭dns反向解析,极大提高ssh连接速度
(2)设置xshell私钥登陆linux的
#查看服务器端ip [root@centos7 ~]# hostname -i 192.168.200.141 #在linux服务器端生成rsa密钥对 [root@centos7 ~]# ssh-keygen generating public/private rsa key pair. enter file in which to save the key (/root/.ssh/id_rsa): created directory '/root/.ssh'. enter passphrase (empty for no passphrase): enter same passphrase again: your identification has been saved in /root/.ssh/id_rsa. your public key has been saved in /root/.ssh/id_rsa.pub. the key fingerprint is: sha256:nidwzrv1xq4er0zh0fqfhpvricjfpucnl3vt89zet0m root@centos7.5 the key's randomart image is: +---[rsa 2048]----+ | | | | | . | | o . eo| | o . s o +.+| | o . o * + = *.| | o o b * o +.=| | o * o . b ==| | o. oooo + .o=| +----[sha256]-----+
#将生成的公钥导入到服务器端的~/.ssh/authorized_keys文件里 [root@centos7 ~]# cd .ssh/ [root@centos7 .ssh]# ls id_rsa id_rsa.pub [root@centos7 .ssh]# cat id_rsa.pub > authorized_keys [root@centos7 .ssh]# ls authorized_keys id_rsa id_rsa.pub [root@centos7 .ssh]# cat authorized_keys ssh-rsa aaaab3nzac1yc2eaaaadaqabaaabaqdmngbvynnojir7tfb9l7n2dplsorheub4747xt2q5z3g9cvm/d5asyfogccpfyfxizunfih2ieqos8zxjpnu/1jy6suxpwld2smxhyip+ptqjims568asvs1pzhxkshcpk8yxenpid73vqx8p8h9nd5/y94uwmksc8ysnodsw7touug9vdtjzw06luwxfakuapt6teb3mq6ma2lzmduck1nicrdbmpadcdsfal3mzchqxtvt3snirutie8dhtlgpycebpwvojuoz8hrqtzamhjaf7xhf4yw5d0m937ky16rqntzijoevfhejaumv875suseachjggj5pjfxjhq6d/p root@centos7.5
#将私钥文件id_rsa改名为rd_rsa_root并导出到宿主机桌面上 [root@centos7 .ssh]# ls authorized_keys id_rsa id_rsa.pub [root@centos7 .ssh]# mv id_rsa id_rsa_root [root@centos7 .ssh]# ls authorized_keys id_rsa.pub id_rsa_root
查看导入到桌面上的私钥文件
而后xshell显示登陆成功!
其实这个私钥id_rsa_root,其他发给人作为金钥就都可以登陆服务器端的了
也。可以发给其他的linux服务器使得他们可以ssh登陆金钥到192.168.200.141服务器端的
具体操作过程如下
#将桌面上的id_rsa_root私钥文件拷贝到任意linux服务器上 [root@yangwenbo .ssh]# ls id_rsa_root #在linux服务器上就不能随意改名字了。将id_rsa_root改名id_rsa [root@yangwenbo .ssh]# mv id_rsa_root id_rsa #授权600权限 [root@yangwenbo .ssh]# chmod 600 id_rsa #进行登陆测试 [root@yangwenbo .ssh]# ssh root@192.168.200.141 -p 22222 last login: mon oct 8 04:52:42 2018 from 192.168.200.143 [root@centos7 ~]# hostname -i 192.168.200.141 [root@centos7 ~]# exit logout connection to 192.168.200.141 closed. [root@yangwenbo .ssh]# hostname -i 192.168.200.143
xshell密钥登陆服务器端的普通用户yunjisuan
#创建用户 [root@centos7 ~]# useradd yunjisuan #创建普通用户云计算下的.ssh密钥目录 [root@centos7 ~]# mkdir -p /home/yunjisuan/.ssh #授权普通用户属主属组 [root@centos7 ~]# chown yunjisuan.yunjisuan /home/yunjisuan/.ssh #.ssh目录必须700权限 [root@centos7 ~]# chmod 700 /home/yunjisuan/.ssh [root@centos7 .ssh]# pwd /root/.ssh [root@centos7 .ssh]# ll total 12 -rw-r--r--. 1 root root 396 oct 8 03:09 authorized_keys -rw-r--r--. 1 root root 396 oct 8 03:07 id_rsa.pub -rw-------. 1 root root 1679 oct 8 03:07 id_rsa_root #将之前root下的authorized_keys文件拷贝过去,然后修改属主属组 [root@centos7 .ssh]# cp -p authorized_keys /home/yunjisuan/.ssh/ [root@centos7 .ssh]# chown yunjisuan.yunjisuan /home/yunjisuan/.ssh/authorized_keys [root@centos7 .ssh]# ll /home/yunjisuan/.ssh/authorized_keys -rw-r--r-- 1 yunjisuan yunjisuan 396 oct 8 03:09 /home/yunjisuan/.ssh/authorized_keys
最后在xshell端用同样的方法远程登录yunjisuan用户选择密钥认证方式即可。
(3)用户权限策略
禁止根用户远程登录系统,授权仅普通用户登陆系统,需要管理员权限执行须藤即可,避免根用户之间登陆
#以root账号授权普通用户yunjisuan所有权限并免输入密码 [root@centos7 ~]# sed -n '93p' /etc/sudoers yunjisuan all=(all) nopasswd: all
#以yunjisuan用户测试提权 [yunjisuan@centos7 ~]$ sudo -l matching defaults entries for yunjisuan on centos7: !visiblepw, always_set_home, match_group_by_gid, env_reset, env_keep="colors display hostname histsize kdedir ls_colors", env_keep+="mail ps1 ps2 qtdir username lang lc_address lc_ctype", env_keep+="lc_collate lc_identification lc_measurement lc_messages", env_keep+="lc_monetary lc_name lc_numeric lc_paper lc_telephone", env_keep+="lc_time lc_all language linguas _xkb_charset xauthority", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin user yunjisuan may run the following commands on centos7: (all) nopasswd: all
[yunjisuan@centos7 ~]$ ls /root/ #权限不够 ls: cannot open directory /root/: permission denied [yunjisuan@centos7 ~]$ sudo ls /root/ anaconda-ks.cfg #如果ssh设置了不然root用户远程登录的配置 #那么我们可以通过此普通用户面密码方式切换成root账户 [yunjisuan@centos7 ~]$ sudo su - last login: mon oct 8 04:54:17 edt 2018 from 192.168.200.143 on pts/1 [root@centos7 ~]# ls anaconda-ks.cfg [root@centos7 ~]# exit logout [yunjisuan@centos7 ~]$ ls [yunjisuan@centos7 ~]$
1.5 线上服务器更新yum源及必要软件安装以及ntp时钟服务设置
1.5.1 更新常用的yum源及必要软件包的安装
centos7.x服务器
#在centos7.x服务器上 #测试一下本机是否能上网 [root@centos7 ~]# ping -c 1 www.baidu.com ping www.a.shifen.com (119.75.213.61) 56(84) bytes of data. 64 bytes from 127.0.0.1 (119.75.213.61): icmp_seq=1 ttl=128 time=7.47 ms --- www.a.shifen.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 7.475/7.475/7.475/0.000 ms
#删除原yum本地源 [root@centos7 ~]# cd /etc/yum.repos.d/ [root@centos7 yum.repos.d]# ls centos-base.repo centos-debuginfo.repo centos-media.repo centos-vault.repo centos-cr.repo centos-fasttrack.repo centos-sources.repo [root@centos7 yum.repos.d]# rm -rf *
#安装epel源 [root@centos7 yum.repos.d]# yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm [root@centos7 yum.repos.d]# ls epel.repo epel-testing.repo
#下载并安装repoforge源 [root@centos7 yum.repos.d]# yum -y install http://repository.it4i.cz/mirrors/repoforge/redhat/el7/en/x86_64/rpmforge/rpms/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm [root@centos7 yum.repos.d]# ls epel.repo mirrors-rpmforge mirrors-rpmforge-testing epel-testing.repo mirrors-rpmforge-extras rpmforge.repo
#清空旧yum缓存,创建新yum缓存 [root@centos7 yum.repos.d]# yum -y clean all [root@centos7 yum.repos.d]# yum makecache #更新系统中已经安装的软件包 [root@centos7 yum.repos.d]# yum -y update
centos6.x服务器
#在centos6.x服务器上 [root@centos6 ~]# ls /etc/yum.repos.d/ bak centos-media.repo #测试一下服务器是否能上网 [root@centos6 ~]# ping -c 1 www.baidu.com ping www.a.shifen.com (119.75.213.61) 56(84) bytes of data. 64 bytes from 127.0.0.1 (119.75.213.61): icmp_seq=1 ttl=128 time=15.2 ms --- www.a.shifen.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 1463ms rtt min/avg/max/mdev = 15.251/15.251/15.251/0.000 ms
#安装epel源 [root@centos6 ~]# cd /etc/yum.repos.d/ [root@centos6 yum.repos.d]# yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm [root@centos6 yum.repos.d]# ls bak centos-media.repo epel.repo epel-testing.repo
#下载并安装repoforge源 [root@centos6 yum.repos.d]# yum -y install http://repository.it4i.cz/mirrors/repoforge/redhat/el6/en/x86_64/rpmforge/rpms/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm [root@centos6 yum.repos.d]# ls bak epel.repo mirrors-rpmforge mirrors-rpmforge-testing centos-media.repo epel-testing.repo mirrors-rpmforge-extras rpmforge.repo
#清空旧yum缓存,创建新yum缓存 [root@centos6 yum.repos.d]# yum -y clean all [root@centos6 yum.repos.d]# yum makecache #更新系统中已经安装的软件包 [root@centos6 yum.repos.d]# yum -y update
1.5.2 修改时区与定时自动更新服务器时间
推荐时间服务器:ntp.sjtu.edu.cn ntp1.aliyun.com
#安装ntpdate时间同步客户端 [root@centos6 ~]# yum -y install ntpdate [root@centos6 ~]# rpm -qa ntpdate ntpdate-4.2.6p5-1.el6.centos.x86_64 #修改时区 [root@centos6 ~]# cp /usr/share/zoneinfo/asia/shanghai /etc/localtime #进行时间同步 [root@centos6 ~]# ntpdate ntp1.aliyun.com 8 oct 17:45:36 ntpdate[1573]: adjust time server 120.25.115.20 offset -0.000011 sec #将时间同步加入定时任务 [root@centos6 ~]# echo '*/5 * * * * /usr/sbin/ntpdate ntp.sjtu.edu.cn >> /var/log/ntp.log 2>&1;/sbin/hwclock -w' >> /var/spool/cron/root [root@centos6 ~]# crontab -l */5 * * * * /usr/sbin/ntpdate ntp.sjtu.edu.cn >> /var/log/ntp.log 2>&1;/sbin/hwclock -w #说明:/sbin/hwclock -w :将时钟信息刷新到bios里
1.6 精简开机服务,删除无关用户,清理垃圾文件,重要文件安全策略
1.6.1 线上服务器必须开启的五个服务
crond的,网络,系统日志,sshd的,sysstat
1.6.2 删除无关用户
略
1.6.3 定时自动清理垃圾文件
(1)查找大文件的方法
[root@centos7 /]# du -sh ./* 0 ./bin 97m ./boot 0 ./dev 31m ./etc 16k ./home 0 ./lib 0 ./lib64 4.2g ./media 0 ./mnt 0 ./opt du: cannot access ‘./proc/1486/task/1486/fd/4’: no such file or directory du: cannot access ‘./proc/1486/task/1486/fdinfo/4’: no such file or directory du: cannot access ‘./proc/1486/fd/4’: no such file or directory du: cannot access ‘./proc/1486/fdinfo/4’: no such file or directory 0 ./proc 48k ./root 7.6m ./run 0 ./sbin 0 ./srv 0 ./sys 0 ./tmp 998m ./usr 759m ./var
[root@centos7 /]# cd /usr/ [root@centos7 usr]# du -sh ./* 65m ./bin 0 ./etc 0 ./games 36k ./include 437m ./lib 168m ./lib64 12m ./libexec 0 ./local 42m ./sbin 276m ./share 0 ./src 0 ./tmp
(2)定时任务清理的关键目录路径
/var/spool/mail/ #邮件路径 /var/spool/postfix/maildrop #小碎片路径
1.6.4 重要文件安全策略
- chattr + i / etc / sudoers
- chattr + i / etc / shadow
- chattr + i / etc / passwd
- chattr + i /etc/grub.conf
1.7 线上服务器系统内核参数优化策略
1.7.1 显示当前所有系统资源使用限制
[root@centos7 ~]# ulimit -a core file size (blocks, -c) 0 #core文件的最大值为100blocks data seg size (kbytes, -d) unlimited #进程的数据段可以任意大 scheduling priority (-e) 0 #调度优先级 file size (blocks, -f) unlimited #文件可以任意大 pending signals (-i) 3802 #最多有3802个待处理的信号 max locked memory (kbytes, -l) 64 #一个任务锁住的物理内存的最大值为64kb max memory size (kbytes, -m) unlimited #一个任务的常驻物理内存的最大值 open files (-n) 1024 #一个任务最多可以同时打开1024个文件 pipe size (512 bytes, -p) 8 #管道的最大空间为4096(512*8)字节 posix message queues (bytes, -q) 819200 #posix的消息队列的最大值为819200字节 real-time priority (-r) 0 #real-time调度优先级 stack size (kbytes, -s) 8192 #进程的栈的最大值为8192字节 cpu time (seconds, -t) unlimited #进程使用的cpu时间 max user processes (-u) 3802 #当前用户同时打开的进程(包括线程)的最大个数为3802 virtual memory (kbytes, -v) unlimited #没有限制进程的最大地址空间 file locks (-x) unlimited #所能锁住的文件的最大个数没有限制
需要重点关注的内核参数(1):ulimit -c
[root@centos7 ~]# ulimit -c #查看core file size大小,默认0是关闭状态,unlimited是没有限制状态 0 说明: 系统调试时用,当系统的某些进程出现问题,内部会生成一些core文件,我们通过查看这个core文件我们就可以知道发生了什么问题。具体使用在c和c++程序中,它们利用这些文件进行调试
#打开core file size无限制状态 [root@centos7 ~]# ulimit -c unlimited [root@centos7 ~]# ulimit -c unlimited
需要重点关注的内核参数(2):ulimit -f
[root@centos7 ~]# ulimit -f #系统文件的最大大小,默认unlimited是没有限制 unlimited 说明: 控制操作系统中文本文件的大小,有时候,我们的一些应用程序的日志文件,如果我们想控制日志文件的最大的量值的话,我们就需要对这个参数做一些限制。这个参数具体到底限制还是不限制,要具体思考。因为如果限制文件的大小。那么一旦到了文件设定的最大大小,应用程序就不能再写入日志文件了。
需要重点关注的内核参数(3):ulimit -n
[root@centos7 ~]# ulimit -n 1024 说明: 这个参数是我们必须要调整的参数,在生产中1024这个数值基本是不够的。1024就代表系统的内存中同时只能放1024个文件的句柄(打开文件)。一般来说65536就够用了。
[root@centos7 ~]# ulimit -n 65536 [root@centos7 ~]# ulimit -n 65536
需要重点关注的内核参数(4):ulimit -u
[root@centos7 ~]# ulimit -u #系统用户同时打开的进程(线程)的最大数 3802 说明: 很多程序都是用普通用户运行的。用户能够同时并发启用的进程(线程)个数,就代表了我们程序的性能,很多程序都是支持高并发的。因此,这个参数我们是需要修改大的。一般来说65536就够用了
[root@centos7 ~]# ulimit -u 65536 [root@centos7 ~]# ulimit -u 65536
1.7.2 修改内核参数的几种修改方法
- / etc / profile:所有用户生效,永久有效;
- 〜/ .bash_profile中:当前用户生效,永久有效;
- 直接在控制台输入,当前用户有效,临时生效;
- 在/etc/security/limits.conf:指定用户或用户组生效,永久生效;
#在/etc/security/limits.conf中设定对内核的修改,永久生效 [root@centos7 ~]# tail -12 /etc/security/limits.conf #<domain> <type> <item> <value> # #* soft core 0 #* hard rss 10000 #@student hard nproc 20 #@faculty soft nproc 20 #@faculty hard nproc 50 #ftp hard nproc 0 #@student - maxlogins 4 # end of file 说明: <domain> 指定匹配参数修改的用户和用户组,*代表所有用户; <type> 限制的类型soft软限制,hard硬限制; <item> nproc代表最大进程数;nofile代表最大文件打开数;core代表限制内核文件大小;maxlogins代表此用户允许登陆的最大数目 <value> 具体的限制数值 hard硬限制:用户在任何时候都可以活动的进程的最大数量,这是上限。没有任何非root进程能够增加hard ulimit; soft软限制:是对会话或进程实际执行的限制,但任何进程都可以将其增加到hard ulimit的最大值
#增加对系统内核参数的限制,修改完毕,退出登陆在进入即可生效 [root@centos7 ~]# tail -4 /etc/security/limits.conf * soft nofile 65536 * hard nofile 65536 * soft nproc 65536 * hard nproc 65536
#退出登录后,再验证 [root@centos7 ~]# ulimit -a core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 3802 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 65536 #已经改变 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) 65536 #已经改变 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
1.8 线上服务器系统故障排查思路与关注点
(1)tail -f /usr/local/nginx/logs/error.log#服务应用类日志查询
(2)tail -f / var / log / messages#系统应用类日志查询
(3)tail -f / var / log / secure#登录日志查询
(4)dmesg#系统日志查询
(5)/ var / tmp,/ tmp#容易被攻击的点查询
(6)crontab -l,/ etc / crontab#计划任务查询(经常攻击对象)
[root@centos7 ~]# tail -1000 /var/log/secure | grep accepted oct 8 01:48:27 localhost sshd[1235]: accepted password for root from 192.168.200.1 port 50704 ssh2 oct 8 02:19:58 localhost sshd[1832]: accepted password for root from 192.168.200.1 port 50882 ssh2 oct 8 03:12:44 localhost sshd[11788]: accepted password for root from 192.168.200.1 port 51149 ssh2 oct 8 03:18:29 centos7 sshd[907]: accepted password for root from 192.168.200.1 port 51185 ssh2 oct 8 03:32:35 centos7 sshd[1103]: accepted publickey for root from 192.168.200.1 port 51258 ssh2: rsa sha256:nidwzrv1xq4er0zh0fqfhpvricjfpucnl3vt89zet0m oct 8 03:41:10 centos7 sshd[905]: accepted publickey for root from 192.168.200.1 port 51326 ssh2: rsa sha256:nidwzrv1xq4er0zh0fqfhpvricjfpucnl3vt89zet0m oct 8 03:41:46 centos7 sshd[1107]: accepted publickey for root from 192.168.200.1 port 51331 ssh2: rsa sha256:nidwzrv1xq4er0zh0fqfhpvricjfpucnl3vt89zet0m oct 8 03:42:38 centos7 sshd[1127]: accepted publickey for root from 192.168.200.1 port 51341 ssh2: rsa sha256:nidwzrv1xq4er0zh0fqfhpvricjfpucnl3vt89zet0m oct 8 03:42:59 centos7 sshd[1146]: accepted publickey for root from 192.168.200.1 port 51352 ssh2: rsa sha256:nidwzrv1xq4er0zh0fqfhpvricjfpucnl3vt89zet0m oct 8 03:44:46 centos7 sshd[1166]: accepted publickey for root from 192.168.200.1 port 51355 ssh2: rsa sha256:nidwzrv1xq4er0zh0fqfhpvricjfpucnl3vt89zet0m oct 8 04:52:42 centos7 sshd[1239]: accepted publickey for root from 192.168.200.143 port 49638 ssh2: rsa sha256:nidwzrv1xq4er0zh0fqfhpvricjfpucnl3vt89zet0m oct 8 04:54:17 centos7 sshd[1257]: accepted publickey for root from 192.168.200.143 port 49640 ssh2: rsa sha256:nidwzrv1xq4er0zh0fqfhpvricjfpucnl3vt89zet0m oct 8 05:09:39 centos7 sshd[1318]: accepted publickey for yunjisuan from 192.168.200.1 port 51755 ssh2: rsa sha256:nidwzrv1xq4er0zh0fqfhpvricjfpucnl3vt89zet0m
2. linux的系统性能优化思路和方法
2.1 影响linux性能的cpu,内存,磁盘,网络等因素分析
2.1.1 cpu
如何判断多核cpu与超线程
- 顶部命令按数字1,可以看到cpu一共有多少核
- 在/ proc内/ cpuinfo查看并过滤
#查看/proc/cpuinfo里部分信息 [root@centos7 ~]# cat /proc/cpuinfo processor : 0 #cpu的线程号,过滤这个获得服务器的总线程数 vendor_id : genuineintel cpu family : 6 model : 61 model name : intel(r) core(tm) i5-5200u cpu @ 2.20ghz stepping : 4 microcode : 0x11 cpu mhz : 2194.917 cache size : 3072 kb physical id : 0 #cpu的物理id号。过滤这个获得服务器的物理cpu数 siblings : 1 core id : 0 #表示当前的信息出自physical id为0的cpu上的第一个核心 cpu cores : 1 #表示当前物理physical id为0的cpu上有4个核心 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 20 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch epb fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap xsaveopt dtherm ida arat pln pts bogomips : 4389.83 clflush size : 64 cache_alignment : 64 address sizes : 42 bits physical, 48 bits virtual power management:
#查看物理服务器有几个物理cpu [root@centos7 ~]# cat /proc/cpuinfo | grep "physical id" physical id : 0 #物理id号 [root@centos7 ~]# cat /proc/cpuinfo | grep "physical id" | uniq physical id : 0 [root@centos7 ~]# cat /proc/cpuinfo | grep "physical id" | uniq | wc -l #服务器一共有一个物理cpu 1 #查看物理服务器的cpu的总线程数 [root@centos7 ~]# cat /proc/cpuinfo | grep "processor" | uniq | wc -l 1 #查看物理服务器的cpu的总核心数 [root@centos7 ~]# cat /proc/cpuinfo | grep "core id" | wc -l 1
主要消耗cpu的业务:动态web服务,邮件服务
2.1.2 内存
- 物理内存与交换的取舍
- 选择64位的linux操作系统
如果物理内存大于16g,那么交换等于物理内存或者是物理内存两倍都是可以的。
如果物理内存小于16g,那么交换和内存大小保持一致。
消耗内存的业务:内存数据库(redis的/ hbase的/ mongodb的)
2.1.3 磁盘i / o.
- raid技术(raid 0/1/5/10)
- ssd磁盘
消耗磁盘的业务:数据库服务器
2.1.4 网络带宽
- 网卡/交换机的选择:起码千兆网卡/千兆普通交换机/万兆核心交换机
- 操作系统双网卡绑定:通过绑定提高网卡带宽吞吐量
消耗带宽的业务:分布式文件系统,视频业务平台
2.2 影响linux性能的操作系统相关资源分析
2.2.1 系统安装优化
磁盘分区,raid设置,交换设置
2.2.2 内核参数优化
- ulimit -n(文件最大打开数)
- ulimit -u(最大用户的进程数)
2.2.3 文件系统优化
- ext4:linux的原生态文件格式
- xfs:centos7开始默认支持
应用建议:
读操作频繁,同时小文件众多的应用:首选ext4系统-文件
写操作频繁的应用,首选的xfs。
2.2.4 程序问题
此类问题需要开发人员查看代码,介入处理。但作为运维人员需要给出程序问题的有力证据。
2.3 系统性能调优之cpu性能评估工具与优化经验
2.3.1 vmstat(系统默认自带)
利用vmstat的命令可以对操作系统的内存信息,进程状态,cpu活动等进行监视。
[root@centos7 ~]# which vmstat /usr/bin/vmstat [root@centos7 ~]# vmstat 3 5 #每3秒刷新一次,输出5次数据 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 810276 2124 108028 0 0 13 1 41 63 0 0 99 0 0 1 0 0 810276 2124 108060 0 0 0 0 66 82 0 0 100 0 0 0 0 0 810276 2124 108060 0 0 0 0 65 78 0 0 100 0 0 0 0 0 810276 2124 108060 0 0 0 0 64 78 0 0 100 0 0 0 0 0 810276 2124 108060 0 0 0 0 65 76 0 0 100 0 0
特效:
- r列表示运行和等待cpu时间片的进程数,这个值如果长期大于系统cpu个数,说明cpu不足,需要增加cpu
- b列表示在等待资源的进程数,比如正在等待i / o,或者内存交换等。长期大于0,那么说明cpu不足
记忆:
- swpd列表示切换到内存交换区的内存数量(以k为单位)。如果swpd的值不为0,或者比较大,只要si,so的值长期为0,这种情况下一般不用担心,不会影响系统性能。
- 免费列表示当前空闲的物理内存数量(以k为单位)
- buff列表示缓存的内存数量,一般对块设备的读写才需要缓冲。
- 缓存列表示页面缓存的内存数量,一般作为文件系统缓存,频繁访问的文件都会被缓存,如果缓存值较大,说明缓存的文件数较多,如果此时io中bi比较小,说明文件系统效率比较好。
交换
- si列表示由磁盘调入内存,也就是内存进入内存交换区的数量
- 所以列表示由内存调入磁盘,也就是内存交换区进入内存的数量
一般情况下,si,so的值都为0,如果si,so的值长期不为0,则表示系统内存不足。需要增加系统内存。
io项显示磁盘读写状况
- 双列表示从块设备读入数据的总量(即读磁盘)(每秒kb)
- 柏列表示写入到块设备的数据重量(即写磁盘)(每秒kb)
这里我们设置的双+博参考值为1000,如果超过1000,而且wa值较大,则表示系统磁盘io有问题,应该考虑提高磁盘的读写性能。
system显示采集间隔内发生的中断数
- 在列表示在某一时间间隔中观测到的每秒设备中断数
- cs列表示每秒产生的上下文切换次数
上边这两个值越大,会看到由内核消耗的cpu时间会越多
cpu项显示了cpu的使用状态,此列是我们关注的重点
- 我们列显示了用户进程消耗的cpu时间百分比.us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,就需要考虑优化程序或算法。
- sy列显示了内核进程消耗的cpu时间百分比.sy的值比较高时,说明内核消耗的cpu资源很多。
- 美国+ sy的参考值为80%,如果我们+ sy大于80%说明可能存在cpu资源不足。
- d列显示了cpu处于空闲状态的时间百分比。
- wa列显示了io等待所占用的cpu时间百分比。
- wa值越高,说明io等待越严重,根据经验,wa的参考值为20%时,如果wa超过20%,说明io等待严重,引起io等待的原因可能是磁盘大量随机读写造成的,也可能是磁盘或者磁盘控制器的带宽瓶颈造成的(主要是块操作)
综上所述:
在对cpu的评估中,需要重点注意的是特效项[r列的值和cpu项中我们,sy和id列的值
2.3.2 iostat
[root@centos7 ~]# iostat -c 3 5 linux 3.10.0-862.3.3.el7.x86_64 (centos7.5) 2018年09月01日 _x86_64_ (8 cpu) avg-cpu: %user %nice %system %iowait %steal %idle 0.03 0.00 0.02 0.00 0.00 99.95 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.00 0.00 0.00 100.00 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.00 0.00 0.00 100.00 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.04 0.00 0.00 99.96 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.00 0.00 0.00 100.00
2.3.3 正常运行时间和w
[root@centos7 ~]# uptime 00:40:01 up 2:01, 2 users, load average: 0.03, 0.05, 0.05 [root@centos7 ~]# w 00:40:03 up 2:01, 2 users, load average: 0.03, 0.05, 0.05 user tty from login@ idle jcpu pcpu what root tty1 00:22 16:11 0.03s 0.03s -bash root pts/0 192.168.200.1 00:25 3.00s 0.03s 0.00s w
2.4 系统性能调优之内存性能,磁盘性能评估工具与优化经验
2.4.1 free -m(评估内存)
#查看centos6.x的内存情况 [root@centos6 ~]# free -m total used free shared buffers cached mem: 980 300 680 0 17 187 -/+ buffers/cache: 96 884 swap: 1983 0 1983 说明: 系统可使用的剩余内存容量:884m ===> 系统剩余内存 680m + buffers 17m + cached 187m 通过swap可以看出来,交换分区使用量为0,说明系统内存资源还非常充足。
#查看centos7.x的内存情况 [root@centos7 ~]# free -m total used free shared buff/cache available mem: 974 76 710 7 187 737 swap: 2047 0 2047 说明: 系统剩余内存容量:710m buffers+cache容量:187m 系统可用剩余内存容量为:available 737m
一般情况我们可以这样去判断内存:
- 系统可用剩余内存总量/系统物理内存重量> 70%时,表示系统内存资源非常充足,不影响系统性能;
- 系统可用剩余内存总量/系统物理内存重量<20%时,表示系统内存资源紧缺,需要增加系统内存;
- 20%<系统可用剩余内存总量/系统物理内存重量<70%时,表示系统内存资源基本能满足应用需求,暂时不影响系统性能。
2.4.2 sar(主要评估内存)
此两个命令主要用于监控全部或指定进程占用系统资源的情况,如cpu,内存,设备i / o
三个公用参数:-u(获取cpu状态), - r(获取内存状态), - d(获取磁盘)
[root@centos7 ~]# sar -u 3 #每3秒获取一次cpu状态信息 linux 3.10.0-862.3.3.el7.x86_64 (centos7.5) 2018年09月02日 _x86_64_ (8 cpu) 15时46分38秒 cpu %user %nice %system %iowait %steal %idle 15时46分41秒 all 0.00 0.00 0.04 0.00 0.00 99.96 15时46分44秒 all 0.00 0.00 0.00 0.00 0.00 100.00 [root@centos7 ~]# sar -r 3 #每3秒获取一次mem状态信息 linux 3.10.0-862.3.3.el7.x86_64 (centos7.5) 2018年09月02日 _x86_64_ (8 cpu) 15时47分57秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 15时48分00秒 586576 411396 41.22 2684 256608 193496 6.25 191660 103324 0 15时48分03秒 586584 411388 41.22 2684 256608 193496 6.25 191660 103324 0 说明: kbmemfree:表示空闲物理内存大小 kbmemused:表示已经使用的物理内存大小 %memused:表示已经使用内存占总内存百分比 kbbuffers和kbcached:表示buffers和cache占用的大小 kbcommit和%commit分别表示应用程序当前使用的内存大小和使用百分比
2.4.3 iostat -d组合(主要评估磁盘)
[root@centos7 ~]# iostat -d 2 3 linux 3.10.0-862.3.3.el7.x86_64 (centos7.5) 2018年09月02日 _x86_64_ (8 cpu) device: tps kb_read/s kb_wrtn/s kb_read kb_wrtn sda 0.62 16.00 6.85 207832 89039 scd0 0.02 0.23 0.00 2978 0 dm-0 0.48 15.20 6.70 197510 86991 dm-1 0.01 0.17 0.00 2228 0 device: tps kb_read/s kb_wrtn/s kb_read kb_wrtn sda 0.00 0.00 0.00 0 0 scd0 0.00 0.00 0.00 0 0 dm-0 0.00 0.00 0.00 0 0 dm-1 0.00 0.00 0.00 0 0 device: tps kb_read/s kb_wrtn/s kb_read kb_wrtn sda 0.00 0.00 0.00 0 0 scd0 0.00 0.00 0.00 0 0 dm-0 0.00 0.00 0.00 0 0 dm-1 0.00 0.00 0.00 0 0 说明: dev:表示磁盘设备名称 tps:表示每秒到物理磁盘的传送数,也就是每秒的i/o流量。一个传送就是一个i/o请求,多个逻辑请求可以被合并为一个物理i/o请求。 kb_read/s:每秒读取的数据块 kb_wrtn/s:每秒写入的数据块 kb_read:读取的所有数据块总数 kb_wrtn:写入的所有数据块总数
2.5 系统性能调优之网络性能评估工具
2.5.1 ping命令
[root@centos7 ~]# ping 127.0.0.1 ping 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.016 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.049 ms 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.051 ms ^c --- 127.0.0.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1999ms rtt min/avg/max/mdev = 0.016/0.038/0.051/0.017 ms 说明: 在这个输出中,time值表示了两台主机之间的网络延时情况,如果值很大,则表示网络的延时很大,单位为毫秒。在这个输出的最后,还有一个统计总结。packet loss表示网络丢包率,值越小,网络质量越高
2.5.2 netstat命令
- netstat -rn(查看路由情况)<====> route -n
- netstat -i(查看网络接口状态)
[root@centos7 ~]# netstat -rn kernel ip routing table destination gateway genmask flags mss window irtt iface 0.0.0.0 192.168.200.2 0.0.0.0 ug 0 0 0 ens32 169.254.0.0 0.0.0.0 255.255.0.0 u 0 0 0 ens32 192.168.200.0 0.0.0.0 255.255.255.0 u 0 0 0 ens32 [root@centos7 ~]# route -n kernel ip routing table destination gateway genmask flags metric ref use iface 0.0.0.0 192.168.200.2 0.0.0.0 ug 0 0 0 ens32 169.254.0.0 0.0.0.0 255.255.0.0 u 1002 0 0 ens32 192.168.200.0 0.0.0.0 255.255.255.0 u 0 0 0 ens32 [root@centos7 ~]# netstat -i kernel interface table iface mtu rx-ok rx-err rx-drp rx-ovr tx-ok tx-err tx-drp tx-ovr flg ens32 1500 1189 0 0 0 868 0 0 0 bmru lo 65536 70 0 0 0 70 0 0 0 lru
2.5.3 mtr / traceroute命令
跟踪网络路由状态,推荐使用地铁,动态跟踪网络路由,用于排除网络问题非常方便。
#安装命令 [root@centos6 ~]# yum -y install traceroute mtr [root@centos6 ~]# rpm -qa traceroute mtr traceroute-2.0.14-2.el6.x86_64 mtr-0.75-5.el6.x86_64 #traceroute追踪到www.baidu.com的路由器 [root@centos6 ~]# traceroute www.baidu.com traceroute to www.baidu.com (111.13.100.92), 30 hops max, 60 byte packets 1 192.168.200.2 (192.168.200.2) 0.327 ms 0.206 ms 0.172 ms 2 * * * 3 * * * 4 * * * 5 * * * 6 * * * 7 * * * #中间省略。。。 29 * * * 30 * * *
traceroute虽然也能追踪数据包,但是并不能直观的看
mtr命令-n不用主机解析-c发送数据包个数--report结果显示,不动态
2.6 linux操作系统性能分析标准
影响性能因素 | 评判标准 | 评判标准 | 评判标准 |
---|---|---|---|
好 | 坏 | 糟糕 | |
*处理器 | 用户%+ sys%<70% | 用户%+ sys%= 85% | 用户%+ sys%> = 90% |
内存 | 交换输入(si)= 0;交换输出(so)= 0 | 每cpu 10页/秒 | 更多交换和交换 |
磁盘 | 爱荷华州%<20% | iowait%= 35% | iowait%> = 50% |
- %用户:表示cpu处在用户模式下的时间百分比
- %sys:表示cpu处在系统模式下的时间百分比
- %iowait:表示cpu等待输入输出完成时间的百分比
- 交换:即si,表示虚拟内存的页导入,即从swap disk交换到ram