1、不使用root用户,添加普通用户,然后通过sudo授权管理
2、我们可以修改默认的远程连接ssh服务的端口,以及禁止root用户远程连接
3、定时自动更新服务器时间,配置国内的yum源
4、修改磁盘阵列
对于写操作频繁而且对数据安全性要求不高时,可以把磁盘做成raid0
对于数据安全性较高,对读写没有特别要求的,做成raid1
对于读操作要求高,对写操作无特殊要求,并保证数据安全性的,做成raid5
对于读写操作要求都很高,而且对数据安全性的要求也很高,做成raid10 raid01
修改磁盘阵列
添加四块硬盘,先安装mdadm软件,我们先使用fdisk -l 查看分区情况,可以看到四块磁盘sdb sdc sdd sde. 我们给每块磁盘创建分区,修改分区类型,使用fdisk /dev/sdb 创建主分区,回车默认即可,然后输入t修改分区类型,l可以列出代码,我们输入fd选择raid自动,w保存退出即可,四个磁盘都这样的操作即可。验证一下磁盘是否已经做raid,然后我们开始创建raid,mdadm -C -v /dev/md0 -l5 -n3 /dev/sd[b-d]1 -x1 /dev/sde1,创建raid名为md0,-l5 使用的raid级别是raid5,-x1 是备份磁盘sde,然后就做好了raid5
mdadm -D /dev/md0查看raid磁盘详细信息 -S 停止RAID -A 启动RAID
5、修改swap的大小
swap交换分区,当内存不足时可以交换出去一部分,但是swap交换时会触发高io,同时会降低系统的性能,所以我们进行优化。
如果物理内存比较小,一般设置swap交换分区大小为内存的2倍。如果物理内存大小大于8GB,一般设置swap分区大小等于或略小于物理内存大小即可
6、内核优化
我们可以调整vm脏数据刷新策略,/proc/sys/vm/dirty_expire_centisecs,脏数据在缓存中允许保留的时长默认3000即30s,如果业务的数据是连续性的写,我们就可以适当调小此参数。
调整脏页面占总内存的最大比例,/proc/sys/vm/dirty_background_ratio,值默认是10,超过这个值,会刷新脏页面到磁盘,增加这个值,系统会分配更多的内存用于写缓冲,因而可以提升写磁盘的性能,我们根据需求结合业务,进行配置即可。
在/etc/sysctl.conf添加一些参数
net.ipv4.tcp_retries = 5 放弃回应一个tcp连接请求前,需要多少次重试
net.ipv4.tcp_syn_retries = 5对于一个新建连接,内核要发送多少个syn连接请求才决定放弃
TCP内核参数优化调整,/proc/sys/net/ipv4存放着tcp参数的文件
tcp_keepalive_time 每次正常发送心跳的周期,默认7200s,推荐600s
tcp_keepalive_probes 在发送心跳消息后,没有接受到对方确认,继续发送探测包次数,默认9,推荐3
tcp_keepalive_intvl 探测消息未获得响应时,重发消息的时间间隔,默认75s,推荐15s
tcp_retries2 丢弃一个tcp连接请求时,需要进行多少重试,默认7次,建议3次
tcp_max_syn_backlog 对于那些依然还未获得客户端确认的连接请求,需要保存在队列中的最大数目,一般默认1024,如果服务器经常出现过载,可以尝试增大这个数字。
7、清除系统内存
我们先使用free -m 查看内存使用情况,如果cache有点多,先使用sync把buff中的数据写入磁盘,然后使用命令echo 3 > /proc/sys/vm/drop_caches,就可以清除一些缓存
1、修改文件句柄,每一次用户发起请求,就会生成一个文件句柄,默认是1024个,对Nginx来说太小
系统全局修改,在/etc/security/limits.conf,添加参数
root soft nofile 65535
root hard nofile 65535
* soft nofile 25535
* hard nofile 25535
soft 到达设定值后,操作系统不会采取任何措施,只是发提醒
hard达到设定值后,操作系统会采取机制对当前进程进行限制,这个时候请求会有影响
配置文件修改,修改worker_rlimit_nofile 35535 适当增大即可
2、cpu亲和配置
cpu的亲和能够使nginx对于不同的work工作进程绑定到不同的cpu上面去。就能够减少在work间不断切换cpu,进程迁移的频率小,来减少性能损耗,一般可以设置为auto自动绑定
查看cpu核心数 cat /proc/cpuinfo | grep "cpu cores" |uniq
3、设置work_connections连接数
每一个进程可以处理多少个连接,增加该值可以提高系统的并发能力
4、配置keepalive timeout
长连接的等待时间,可以根据需求进行优化
5、打开配置GZIP压缩
可以打开压缩,压缩访问页面的图片等一些资源提高访问速度, 进而优化Nginx性能
gzip_min_length 指定最小压缩文件大小
gzip_comp_level 指定压缩级别 范围为1到9,值越大压缩程度越大,但是会增加相当大的处理开销,增大延时,适当即可
安全方面:修改默认端口号,禁止root用户远程登录,对用户降权,以普通用户运行mysql
性能方面:升级硬件、内存、磁盘,优化sql语句(开启慢查询),设置索引
参数优化:innodb的buffer缓冲参数调大,连接数调大,缓存的参数优化
架构方面:读写分离,一主多从,高可用集群等
参数优化
修改back_log的值,如果MySQL的连接数达到最大连接值,新来的请求会被存在堆栈中,以等待某一连接释放资源。
修改wait_timeout数值,当MySQL连接闲置超过一定时间后会被强行关闭 show processlist 可以查看状态,如果有大量的sleep就可以设置
MySQL语句优化
1、避免使用select *
2、尽可能的把字段设置成NOT NULL,这样在执行查询的时候,数据库不用去比较NULL值
3、对于部分的文本字段,比如“性别”,我们就可以用enum来定义。MySQL会把enum类型的数据当作数值型来处理,而数值型数据被处理起来的速度要比文本类型快的多。
4、建数据库表时,给字段设置固定合适的大小即可,设置太大就会浪费,查询速度变慢
5、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
6、应尽量避免在 where 子句中使用 !=或<> 操作符,否则将引擎放弃使用索引而进行全表扫描
1.服务器资源
增加cpu,内存,硬盘
2.采用集群
单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat集群是有效提升性能的手段。我们还是采用了Nginx来作为请求分流的服务器。
3.优化tomcat参数
调优Tomcat线程池:增加线程池中最大的线程数量等
调优tomcat的连接器Connector:关闭DNS解析,减少性能损耗,修改最少最大可以创建的线程数,等
4.jvm优化
Tomcat 是运行在 JVM 上的,所以对 JVM 的调优也是非常有必要的。
找到 catalina.sh;调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。
5.定时重启tomcat
性能优化:
内存优化:-Xms java虚拟机初始化时的最小内存、-Xmx java虚拟机可使用的最大内存
并发优化:maxThreads 客户请求最大线程数、minSpareThreads tomcat初始化时创建的socket线程数、maxSpareThreads tomcat连接器的最大空闲socket线程数、enableLookups 若设置为true,则支持域名解析,可把ip地址解析为主机名、redirectPort 在需要基于安全通道的场合,把客户请求转发到基于ssl的redirectPort端口、acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads)、connectionTimeout 连接超时
缓存优化:compression 打开压缩功能、
compressionMinSize 启用压缩的输出内容大小,默认为2kb、compressableMimeType 压缩类型、connectionTimeout定义建立客户连接超时的时间,如果为-1,表示不限制建立客户连接的时间
安全方面优化
降权启动,防止不法分子通过tomcat获得root权限
修改端口号:修改tomcat配置文件server.xml中的http连接器端口号,防止黑客攻击
更改tomcat的关闭指令:
隐藏服务类型:在server.xml文件中,为connector元素添加server=” ”,注意不是空字符串,是空格组成的长度为1的字符串,或者输入其他的服务类型,在response header中不显示server的信息
1.将新对象预留在新生代
可以为应用程序分配一个合理的新生代空间,以最大限度避免新对象直接进去老年代。
2.大对象进入老年代
大对象占用空间多,直接放入新生代中会扰乱新生代GC,新生代空间不足将会把大量的较小的年轻代对象移入到老年代中,这对GC来说是相当不利的
3.设置对象进入老年代的年龄
当对象年龄达到阀值时,就移动到老年代,
4.稳定与震荡的堆大小
稳定的堆大小对垃圾回收是有利的,获得一个稳定堆大小的方法就是设置 -Xmx 和 -Xms 一样的值
1、限制Redis内存大小 config set maxmemory 6GB
如果不限制的话有可能会导致物理内存不足,这样就会使用swap空间,会增大cpu消耗,而操作系统将Redis所用的内存移至swap时,会阻塞Redis进程,从而影响性能,一般预留30%即可
2、内存回收策略,避免大量数据同时失效
有大量缓存在同一时间同时过期,那么会导致 Redis 循环多次持续扫描删除过期字典,直到过期字典中过期键值被删除的比较稀疏为止,而在整个执行过程会导致 Redis 的读写出现明显的卡顿,也会消耗cpu
3、使用slowlog优化耗时命令
使用 slowlog 功能找出最耗时的 Redis 命令进行相关的优化,以提升 Redis 的运行速度
slowlog-log-slower-than 设置慢查询的评定时间,也就是说超过此配置项的命令,将会被当成慢操作记录在慢查询日志中
slowlog-max-len 用来配置慢查询日志的最大记录数
4、合理设置键值的过期时间
我们应该根据实际的业务情况,对键值设置合理的过期时间,这样 Redis 会帮你自动清除过期的键值对,以节约对内存的占用,以避免键值过多的堆积,频繁的触发内存淘汰策略