- 磁盘选择(这里只介绍常用的几种组合)
系统盘:raid1
数据盘:raid5/raid1/raid10
- 分区规范
系统分区和数据分区分离原则
不分离的话如果磁盘损坏或磁盘某一分区文件系统破坏会非常非常麻烦,在线修复是不可能的,本地修复也是有风险的,而如果分离的话,数据分区遭到破坏则卸载该分区,fsck修复过再挂载上去,系统分区损坏的话直接重新安装系统即可,同时数据系统不会受到影响
LVM是否需要
多分区原则(/、/boot、/var、/usr、/data)
/ 存放操作系统本身程序
/boot 存放启动程序
/var 存放log日志
/usr 存放安装的第三方应用程序 //前四个系统分区必须分
/data 存放数据,自己起名字 //数据分区,除去系统分区剩下空间都给他
- swap使用建议
默认超过内存40%使用swap
对应Windows的缓存(扩展分区)
作用:
做内存缓存,当业务出现峰值,或需求猛增的时候,避免物理内存耗尽短时间紧缺后宕机,建议设置,可以象征意义少设
centos7默认只有vi,vim编辑器都用不了,还有许多基础命令也要自己添加
[root@zbh ~]# mount /dev/sr0 /mnt/
[root@zbh ~]# df -Th |tail -1
/dev/sr0 iso9660 4.2G 4.2G 0 100% /mnt
[root@zbh ~]# cd /etc/yum.repos.d/
[root@zbh yum.repos.d]# touch a.repo
[root@zbh yum.repos.d]# cat a.repo
[zbh]
name=zbh
baseurl=file:///mnt
gpgcheck=0
[root@zbh yum.repos.d]# yum clean all && yum makecache
先安装vim
[root@zbh yum.repos.d]# yum -y install vim
默认没有route ifconfig netstat traceroute traceroute6命令
[root@zbh yum.repos.d]# yum -y install traceroute net-tools
上传下载命令
[root@zbh yum.repos.d]# yum -y install lrzsz
centos7默认网卡名为ens33,可以修改为eth0 (看个人习惯,也可不改;或者安装系统时就做好)
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp //看自己需要,可以为为static,dhcp或bootp
#IPADDR=192.168.6.10
#NETMASK=255.255.255.0
#GATEWAY=192.168.6.1
DNS1=8.8.8.8
DNS2=4.2.2.2
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=110a224c-4c69-4248-a3f4-e8aea3bd62d3
DEVICE=eth0
ONBOOT=yes
[root@localhost ~]# mv /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-eth0 //重命名配置文件
[root@localhost ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root net.ifnames=0 biosdevname=0 rd.lvm.lv=centos/swap rhgb quiet" //增加两行,看清楚位置
GRUB_DISABLE_RECOVERY="true"
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
//重新生成GRUB配置并更新内核参数
[root@localhost ~]# reboot //重启再次查看即生效
临时的,重启会失效
[root@localhost ~]# hostname zbh
[root@localhost ~]# bash
[root@zbh ~]#
或者再打开一个session 验证
永久的
[root@zbh ~]# vim /etc/sysconfig/network
NETWORKING=yes //系统是否使用网络,yes为使用,no则不能使用网络。
HOSTNAME=zbh //本机主机名,要和/etc/hosts中设置的主机名相对应
GATEWAY=192.168.17.1 //网关IP
[root@zbh ~]# reboot //重启生效
关于hosts文件:一般改主机名是不需要修改hosts文件的,/etc/hosts文件提供的是域名解析的一个功能,类似于DNS,当Linux系统向DNS服务器发出域名解析请求之前会查询/etc/hosts文件,如果里面有相应的记录,就会使用hosts里面的记录 但是如果想使用分布式,需要把主机名和ip绑定在一起时,才需要修改这个hosts文件
临时的,重启会失效
[root@zbh ~]# route add default gw 192.168.17.1 eth0
永久的
[root@zbh ~]# vim /etc/sysconfig/network
NETWORKING=yes //系统是否使用网络,yes为使用,no则不能使用网络。
HOSTNAME=zbh //本机主机名,要和/etc/hosts中设置的主机名相对应
GATEWAY=192.168.17.1 //网关IP
[root@zbh ~]# service network restart //重启生效
查看当前系统语言
[root@zbh ~]# echo $LANG
en_US.UTF-8
查看有没有中文包
[root@zbh ~]# locale -a |grep "zh_CN"
zh_CN
zh_CN.gb18030
zh_CN.gb2312
zh_CN.gbk
zh_CN.utf8 //没有的话yum -y groupinstall "fonts"装一下
修改配置文件
[root@zbh ~]# cat /etc/locale.conf
LANG="zh_CN.UTF-8" //或者使用命令[root@zbh ~]# localectl set-locale LANG=zh_CN.UTF-8
[root@zbh ~]# source /etc/locale.conf //生效配置文件
[root@zbh ~]# echo $LANG //再次查看系统语言,已经发生了改变
zh_CN.UTF-8
这里重点介绍两个参数 -n -u
[root@zbh ~]# 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) 7190
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) 7190
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
- 最大打开文件数 ulimit -n
默认1024
这里并不是指严格意义上的文件,而是指文件句柄,一个进程会加载很多个文件句柄
常见案例日志:Java.net.SocketException:Too many open files
这是在java应用中的一个报错,因为java占用资源方式比较特殊,一个java进程由多线程运行,一个线程又会运行多个文件,即加载很多个文件句柄
修改相关配置文件:
[root@zbh ~]# /etc/security/limits.conf
用户 软硬限制 打开最大文件数的标识 大小
* soft nofile 65535 可以满足一般业务需求,特殊的可以再增大
* hard nofile 65535
退出终端再次登录查看则生效,(加载环境变量生效)线上应用需要重启java服务才生效
- 最大用户数 ulimit -u
Root用户默认不限制,但其实最大7811,是由系统决定的,普通用户默认1024
修改相关配置文件:
[root@zbh ~]# /etc/security/limits.d/20-nproc.conf (centos7.x版本)
这个文件从6版本开始增加的
* soft nproc 65535
root soft nproc unlimited不限制
Centos版本不一样位置也不一样
/proc/sys/net/ipv4/netfilter/ip_conntrack_ma或/proc/sys/net/ipv4/ip_conntrack_max
(centos 5.x 两个文件硬链接关系,修改一个即可)
/proc/sys/net/ipv4/netfilter/nf_conntrack_max (centos 6.x,centos 7.x都是)
常见案例日志:Kernel:ip_conntrack:table full,dropping packet
最经常发生在web服务器,请求量大堆积到前段
原理:
只有开启了iptables才会出现这个问题,iptables启动会默认加载ip_conntrack模块,但线上服务器肯定要开启iptables
Ip_conntrack维护了一个链表,链表是有连接(访问)限制值的,一个请求进来会有一个连接的链表,再来请求会连接第二个,以此类推,当链表满了之后就会出现table full的问题
因此我们为了杜绝这个问题,刚开始部署就要调大这个参数,可以避免很多问题,也不会增加服务器的负载,何乐不为呢
修改相关配置文件:
[root@zbh ~]# /etc/sysctl.conf 在末尾加入
net.ipv4.netfilter.ip_conntrack_max = 655360 (centos 5.x)
net.nf_conntrack_max = 100000 (centos 6.x)
net.netfilter.nf_conntrack_max = 265536(centos 7.x)
[root@zbh ~]# sysctl -p 生效
表示使用swap的概率,值越大代表使用swap的概率越大
有一个计算公式(100-你设置的值)x 100%
[root@zbh ~]# cat /proc/sys/vm/swappiness //查看当前配置
修改相关配置文件:
[root@zbh ~]# /etc/sysctl.conf 在末尾加入
vm.swappiness=10 默认60,一般建议设成20或30
表示当内存超过(100-10)即90%时,才开始使用swap
如果是运行Redis服务的服务器,官方建议必须把这个值设为0,不然查看日志会发现经常报不等于0的错误,因为如果使用swap分区的话,效率会非常低
以下是阿里线上服务的配置,每天3亿的量 仅供参考,请结合具体情况设置
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_max_syn_backlog = 20000
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 500000
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.nf_conntrack_max = 2097152
只开启所需要的服务,充分利用线上资源,同时也更加安全
crond 做守护进程
network 必须启
syslog/rssyslog 做日志记录
sshd 远程连接
iptables 防火墙
udev-post 设备管理器
sysstat 系统监控工具
[root@localhost ~]# vipw
[root@localhost ~]# cat /etc/passwd //两个命令都可以查看目前的所有用户
建议删除不必要的用户
userdel adm
userdel lp
userdel sync
userdel shutdown
userdel halt
userdel news
userdel uucp
userdel video
userdel games
userdel gopher
userdel ftp
建议删除不必要的群组
groupdel adm
groupdel lp
groupdel news
groupdel uucp
groupdel games
groupdel dip
从八、之后的内容更偏重于业务层方面的调优
每个错误的出现,都会给出错误信息提示,一般情况下这个提示基本定位了问题所在,因此一定要重视这个信息所在,否则问题永远得不到解决。
warring 可以忽略(看情况)
error 要重视
日志是问题排查的第一思路,一定要养成查看日志的习惯
系统日志 :
dmesg 实时输出系统级别的正常、警告和报错信息到命令行, 存在内存中
/var/log/messages 以文件形式实时输出系统和应用级别的信息
/var/log/secure 主要是用来判断远程ssh登陆状态
应用日志:
Apache:$APACHE_BASE/logs/error_log $APACHE_BASE/logs/access_log
Nginx:$NGINX_BASE/logs/error_log $NGINX_NASE/logs/access_log
Tomcat:$TOMCAT_BASE/logs/Catalina.out
综合分析过程,以日志文件为导向,配合应用环境,结合报错信息,从而排除故障
网络硬件传输问题(网线/交换机、ping)
检查网卡能否正常工作,如网卡是否正常加载,网卡IP设置是否正确
检查DNS是否设定正确
服务是否正常打开
访问权限是否打开(iptables/selinux/硬件防火墙)
局域网主机之间联机是否正常
1.1 CPU
多核cpu与超线程
[root@localhost ~]# more /proc/cpuinfo
官方曾经做过很多实验 给出过统计:
多核cpu一定程度上会提高运行效率,但是和物理CPU比起来,仅仅是物理CPU性能的30%左右
消耗CPU的业务:动态web服务、mail服务
1.2 内存
物理内存与swap的取舍
在当前内存很便宜的情况下,建议尽量用物理内存,在物理内存不够用的时候,做物理内存的简单扩充就好
详情见一、3.swap使用建议
选择64位操作系统
由于32位本身寻址范围的限制,导致内存使用不够充分
32位原则上一个进程可用的最大内存不能超过2G,得不到有利使用,而64位原则上没有限制
消耗内存的业务:内存数据库(redis/ mongodb/ hbase)
1.3 磁盘IO
RAID技术(raid0/1/5/01/10)
Raid技术的实现是为了更好的利用磁盘,扩大磁盘性能,提高磁盘的安全性和扩展性
详情见一、1.磁盘raid选择
SSD磁盘
在对读写要求非常非常高的情况下使用,
读写性能基本上接近于内存磁盘操作,价格贵
消耗磁盘的业务:数据库服务器(mysql/oracle)
1.4 网络带宽
网卡/交换机的选择
服务器本身网卡和交换机带宽本身要足够大才能充分保证网络性能
操作系统双网卡绑定
当业务对网络带宽要求非常高时,我们可以在操作系统基础之上,考虑做双网卡绑定
常见的可做主备策略或负载绑定,两种方案,具体要结合自己业务情况
消耗带宽的业务:Hadoop平台、视频业务平台
2.1系统安装优化
磁盘分区、raid设置、Swap设置
详情见一、
2.2 内核参数优化
Ulimit -n
Ulimit -u
详情见五、
2.3文件系统优化
[root@localhost ~]# mkfs.ext //Tab,来查看你的系统支持哪些文件系统
mkfs.ext2 mkfs.ext3 mkfs.ext4
ext2:linux下标准文件系统,最古老的,无日志记录(inode)功能
ext3:在ext2基础上增加了日志记录功能,仅支持32000个子目录
ext4:ext3的后续版本,linux2.6.28内核开始支持。无限子目录支持,快速fsck
xfs:高性能文件系统,linux3.10内核开始默认支持。
建议:
读操作频繁,同时小文件众多的应用(web网站),首选ext4,接下来是xfs,ext3
写操作频繁的应用(数据库),首选xfs, 接下来是ext4,ext3
对性能要求不高、数据安全要求不高的业务,ext3是比较好的选择
此类问题(代码优化和bug修复)需要开发人员查看代码,介入处理。
但作为运维人员需要给出程序问题的有力证据。
未完待续…