Linux系统优化

  1. 云栖社区>
  2. 博客>
  3. 正文

Linux系统优化

科技小能手 2017-11-15 15:13:00 浏览861
展开阅读全文

主要讲解了优化那些方面,具体的还要自己参透
最近很多朋友在群里问谁会系统优化这个问题,这个问题博大精:要熟悉系统环境,软件,及网络协议等。我做运维不久我就依照我的写出优化的经验分享给大家把。可能说的很差劲当然是娱乐就行了。

对于系统优化系统是为了提高系统的性能吧,我感觉一个系统做的工作越少并且做到极致,这样对于就能提升性能了。
那么你就要考虑你这台服务器是来做什么的是WEB,数据库,缓存,负载均衡等等,根据你的服务做的事情来优化把他发挥到极致。
1.硬件的选择
对于多少内存多少CPU 什么硬盘,硬件的选择也很重要。
例如:处理器对于应用和数据库服务器来讲是最重要的硬件子系统之一。然而在这些系统中,CPU
经常是性能的瓶颈;磁盘IO问题;内存不足问题。
2 关闭daemons和端口
有些运行在服务器中的daemons (后台服务),并不是完全必要的。关闭这些daemons 可释
放更多的内存、减少启动时间并减少CPU 处理的进程数。减少daemons 数量的同时也增强
了服务器的安全性。缺省情况下,多数服务器都可以安全地停掉几个daemons。
ntsysv  装完后把不必要的服务全部关掉, namp 扫描你开了几个端口没必要的全部关掉。
包括分区的优化 例如: /var 单独一个分区比较好 /lib /dev /bin /sbin /etc 一定不能和根 分区的必须在一个分区的。

3 关闭GUI 这里就不说了图形一定要关系 至于为啥不做详细解析,


4 对于进程 
进程管理对于任何一个操作系统来说都是最重要的任务之一。高效的进程管理能保证应用平稳有效的运行。
进程就是执行程序运行在处理器上的一个实例。进程可以使用Linux内核所能控制的任何资源来完成它的任务。
每个进程都有自己的生命周期如创建、执行、结束和消除。这些阶段在系统启动运行中会被重复无数次。因此从性能角度来看进程生命周期是极其重要的。
进程优先级和Nice值
进程优先级【Process priority】是一个数值,用来让CPU根据动态优先级和静态优先级来决定进程执行的顺序。一个高优先级的进程可以获得更多在处理器上运行的机会。
内核会根据进程的行为和特性使用试探算法【Heuristic Algorithm】来动态调高和调低动态优先级。用户进程可以通过进程Nice的值间接改变静态优先级。
静态优先级高的进程可以获得较长的时间片【Time Slice】(进程能运行在处理器有多长时间)。
Linux中Nice值范围为19(最低优先级)到-20(最高优先级),默认值为0。要将Nice值更改为负数,必须通过登录或使用su命令由root执行。
例如:/bin/taskset -c 0,1,2,3,4,5,6,7 /usr/local/mysql-5.0.89/bin/mysqld_safe &
充分平均分配 CPU 。

5内核的优化
linux的优化最难的也就是内核的优化了
内核参数保存在/proc(特别是/proc/sys),提供了内核、处理器、内存、网络及其他组件的相
关参数。每个执行的进程都有一个以相应PID 命名的目录。
net.ipv4 的参数其实就是大部分是传输优化层的TCP协议,这要求对TCP/IP 非常熟悉才能做到的!
下面是我对一台WEB 服务器的优化参数,
减少TCP 连接中的TIME-WAIT sockets:
编辑/etc/sysctl.conf文件 
net.ipv4.tcp_syncookies = 1                     // 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1                      //表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1                    //表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
用以下语句查看服务器的TCP状态:
#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}
net.ipv4.ip_local_port_range = 32768 65000     // 允许系统打开的端口范围。
net.ipv4.tcp_keepalive_time = 30               // 当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时
net.ipv4.tcp_max_tw_buckets = 60000            // timewait的数量,默认是180000。
                                                  表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为 60000。
                          对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。
                          此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

net.ipv4.tcp_max_syn_backlog = 65536           //记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128
net.core.netdev_max_backlog = 32768       //每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.somaxconn = 32768              //web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,
                                          而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。
net.core.wmem_default = 8388608           
net.core.rmem_default = 8388608 
net.core.rmem_max = 16777216            //最大socket读buffer,可参考的优化值:873200
net.core.wmem_max = 16777216            //最大socket写buffer,可参考的优化值:873200 
net.ipv4.tcp_timestsmps = 0             //时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉
net.ipv4.tcp_synack_retries = 2         //为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。
                                         也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_syn_retries = 2           //在内核放弃建立连接之前发送SYN包的数量
#net.ipv4.tcp_tw_len = 1 
net.ipv4.tcp_wmem = 8192 436600 873200         // TCP写buffer,可参考的优化值: 8192 436600 873200 
net.ipv4.tcp_rmem  = 32768 436600 873200       // TCP读buffer,可参考的优化值: 32768 436600 873200
net.ipv4.tcp_mem = 94500000 91500000 92700000  // 同样有3个值,意思是: 
                                                   net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力. 
                                                   net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段. 
                                                   net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket. 
                                                   上述内存单位是页,而不是字节.可参考的优化值是:786432 1048576 1572864
  
net.ipv4.tcp_max_orphans = 3276800  //系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。
                                      如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。
                                      这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。
net.ipv4.tcp_fin_timeout = 30       //如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
                                     对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,
                         你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,
                         也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,
                         因为它最多只能吃掉1.5K内存,但是它们的生存期长些。

6 内存的调优
内存子系统的调优不是很容易,需要不停地监测来保证内存的改变不会对服务器的其他子系统造成负面影响。
如果要改变虚拟内存参数(在/proc/sys/vm),建议您每次只改变一个参数然后监测效果。对与虚拟内存的调整包括以下几个项目:
_ 配置Linux内核如何更新dirty buffers到磁盘。磁盘缓冲区用于暂存磁盘的数据。
相对于内存来讲,磁盘缓冲区的速度很慢。因此,如果服务器使用这类内存,性能会成问题。当缓冲区内的数据完全dirty,
使用:sysctl -w vm.bdflush="30 500 0 0 500 3000 60 20 0"
vm.bdflush有9个参数,但是建议您只改变其中的3个:
1 nfract, 为排队写入磁盘前,bdflush daemon允许的缓冲区最大百分比
2 ndirty, 为bdflush即刻写的最大缓冲区的值。如果这个值很大,bdflush需要更多的时间完成磁盘的数据更新。
3 nfract_sync, 发生同步前,缓冲区变dirty的最大百分比。
配置kswapd daemon,指定Linux的内存交换页数量
sysctl -w vm.kswapd="1024 32 64"
三个参数的描述如下:
– tries_base 相当于内核每次所交换的“页”的数量的四倍。对于有很多交换信息的系统,增加这个值可以改进性能。
– tries_min 是每次kswapd swaps出去的pages的最小数量。
– swap_cluster 是kswapd 即刻写如的pages数量。数值小,会提高磁盘I/O的性能;数值大可能也会对请求队列产生负面影响。
如果要对这些参数进行改动,请使用工具vmstat检查对性能的影响。其它可以改进性能的虚拟内存参数为:
_ buffermem
_ freepages
_ overcommit_memory
_ page-cluster
_ pagecache
_ pagetable_cache

7 上面对 物理层 网络层 传输层 的优化,应用层的优化也是不可缺少的,就是针对服务的优化了。
./configure  --prefix=/usr/local/mysql-5.0.89/   
--with-unix-socket-path=/tmp/mysql.sock  --localstatedir=/usr/local/mysql-5.0.89/data \
--without-debug \              //去除debug模式
--enable-thread-safe-client \      //以线程方式编译客户端
--enable-assembler \            //使用一些字符函数的汇编版本
--enable-profiling \             //编译一个版本带有查询取样代码
--enable-community-features \    //停用附加功能提供的用户社区
--with-mysqld-ldflags=-all-static \  // 以纯静态方式编译服务端
--with-client-ldflags=-all-static \   // 以纯静态方式编译客户端 
--with-charset=latin1 \           //默认编码拉丁文
--with-extra-charset=utf8,gbk \    //支持编码的格式
--with-innodb \                 //支持innodb表
--with-scv-storage-engine \        //使用SCV存储引擎
--with-mysqld-user=mysql \      //mysqld的守护进程用户
--without-embedded-server \      //构建嵌入式服务器
--with-server-suffix=-community  //附加价值版本的字符串
像mysql 编译的时候就可以优化了 根据你的环境定制。
然后就是装完后优化了例如nginx做weB的优化:
worker_processes 8;
nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数。
worker_rlimit_nofile 102400;
worker_rlimit_nofile 102400;
这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文
件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit
-n 的值保持一致
worker_connections 102400;
每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为
worker_processes*worker_connections。
keepalive_timeout 60;
keepalive 超时时间。
client_header_buffer_size 4k;

客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求
头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分
页大小可以用命令getconf PAGESIZE 取得

open_file_cache max=102400 inactive=20s;
这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件
数一致,inactive 是指经过多长时间文件没被请求后删除缓存。

open_file_cache_valid 30s;
这个是指多长时间检查一次缓存的有效信息。

open_file_cache_min_uses 1;
open_file_cache 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文
件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,
它将被移除。
 其实还有就不一一列举了

最近很多问我 apache的优化参数 :prefork模式的

<IfModule prefork.c>
StartServers          100
    ServerLimit         2000
    MaxCLients          1000
    MinSpareServers       20
    MaxSpareServers      50
    MaxRequestsPerChild   10000

具体看http://hzcsky.blog.51cto.com/1560073/473864

 其实系统的调优是根据自己的个人环境和要求调整的,比例说你公司的硬件不能满足 优化的就可以低一点那也是没办法,
 我们只要尽量把当前的环境优化到极致就可以了。像把一台WEB 服务器 优化到正常访问量 达到100MB左右 那就相当不错。


本文转自 houzaicunsky 51CTO博客,原文链接:http://blog.51cto.com/hzcsky/516666

网友评论

登录后评论
0/500
评论
科技小能手
+ 关注