zoukankan      html  css  js  c++  java
  • 服务器集群优化

    高性能的服务器的架设

    对于高性能网站 ,请求量大,如何支撑?

    1方面,要减少请求

    对于开发人员----合并css, 背景图片, 减少mysql查询等.

    2: 对于运维 nginx的expires ,利用浏览器缓存等,减少查询.

    3: 利用cdn来响应请求

    4: 最终剩下的,不可避免的请求----服务器集群+负载均衡来支撑.

    所以,来到第4步后,就不要再考虑减少请求这个方向了.

    而是思考如何更好的响应高并发请求.

    大的认识-------既然响应是不可避免的,我们要做的是把工作内容”平均”分给每台服务器.

    最理想的状态 每台服务器的性能都被充分利用.

    服务器介绍:

    服务器IP:

    A  192.168.1.201

    B  192.168.1.202

    C 203

    D204

    Root: zixue.it

    1台 A

    RAM: 2G

    HD: 500G

    3台 B, C, D

    RAM: 8G

    Hd  : 200G

                                   
         
         
             
         
       
         
     
     
     
           
           
     
     
     
     

     

    1500万的企业数据在A号服务器的Mysql上。所以我们就让A号服务器作为mysql服务器

    实际生产环境中,服务器之间是有区别的,有的服务器cpu非常强(比如有8个cpu,每个cpu还8个核心,计算浮点数非常厉害,优酷土豆做视频压缩,用这个没错),有的用来做存储cpu不一定强,但是硬盘一定要强,有的计算不复杂,但是进程多,比如跑100个php-fpm进程,内存要大。所以要搞清楚服务器当前的业务是计算密集,还是io密集,还是进程密集。

    静态内容,html,缓存,在B

    memcached,

    步骤:

    1:A号服务器

          1.1安装 mysql

        1.2并导入数据.

    注意:先把表中的索引去掉,加快导入速度

    2: C号服务器:

      2.1: 编译PHP

    注意: enbale-fpm , with-mysql=mysqlnd   (编译成独立fpm进程,支持mysql,)

      2.2: 下载第3方的memcached扩展 编译进来

    3: D号服:

      3.1 编译 memcached

    4: B号服:

    编译nginx ,并配置

    Cd /app/pcre-8.12

    ./configure

    Make && make install

    Cd nginx-1.2.7

    ./configure --prefix=/usr/local/nginx --add-module=/app/ngx_http_consistent_hash-master

    注:红线部分是nginx的第3方模块,需要自己下载.

    安装统计模块,便于观察nginx的状态

    ./configure --prefix=/usr/local/nginx/ --add-module=/app/ngx_http_consistent_hash-master --with-http_stub_status_module

    注:stub_status_module是一个内建的模块,编译的时候,直接加进去就行了

    装完之后,去配置文件配置一下该模块

    1. 专门配置一个location
    2. 把日志关掉,因为是统计模块,没必要加日志
    3. 统计模块一般不给人看,所以只允许192.168.1.100访问
    4. 其他的都deny

    配置完之后在192.168.1.100机器上访问192.168.1.202/status就能看到统计信息了,统计信息格式如下图。

    压力测试:

    安装apache的时候,会有一个小工具ab,位置为:/usr/local/apache/bin/ab 

    我们执行上述命令对nginx服务器进行压力测试,1000并发,50000次请求:结果为下图。

    失败数量达到3721,很不好。

    再进行2000并发 80000请求的压力测试:直接报出Too many open files的错误。

    原因:linux系统,以简洁为美。一切皆文件,我们打开socket连接,也被视为文件,我们一下子打开2000个连接,系统觉得打开的太多了,不允许。

    我们通过如下命令查看:默认只允许打开1024个,果然如此

    用如下命令修改一下,让他一下子能打开20000个

      

    使用status查看,并发最多才800多,我们的并发设置是2000,问题很大

    又测试了并发 请求

    nginx相应请求:

    1. 建立响应请求的socket连接
    2. 打开文件(index.html),并沿socket返回
    3. 万M网卡,能够跑通那么多的流量

    那么高并发,无非就是要考虑系统能否让我同时建立如此多的socket连接,和系统是否允许我同时打开那么多的文件(万兆网卡,那时硬件的问题,不考虑。)

    所以排查问题也要注意这两点

    主要从系统的dmesg和nginx的error.log错误日志来观察

    下面我们对于上面高并发出现的问题进行排查,

    首先看错误日志

    下面的错误日志:报出,open() “index.html” failed ,估计就是由于操作系统是否允许你一个进程打开那么多的html文件造成的

    使用 ulimit –n命令查看,果然如此。那么进行修改。

    修改完毕后,又有洪水攻击

    下面图片 显示 洪水攻击,每次请求带一个cookie、过去,防止洪水攻击

    这不是一个文件,是一个系统运行状态值

    我们把上面的配置做成一个脚本,方便我们以后使用

    一个工作进程允许打开几个文件  worker_rlimit_nofile 10000,放到全局区

    此时再进行压力测试:轻松达到

    查看status也是如此

    1w并发

    再压力测试

    高并发网站 keepalive  2s以内  最好不用

    keepalive没了

    Php 安装配置

    1 tar -xzvf  /path/’

    2 cd /path/

    3 .configure --prefix=/usr/local/php –

    实际生产中,公司都是用多台服务器专门跑php,每台服务器的9000端口来跑php,但是我们这里没有那么多台服务器,我们只有一台,那么我们就多开几个端口来跑php,9000,9001,9002,9003,9004

    php-fpm是独立的进程,是由父进程管理着子进程子进程也监听者对应的端口。每来一个请求,就会起一个子进程,但是如果长时间没有请求,那么这个子进程可能就消失(回收)了。但是对于高并发的网站,基本没有停歇的时候,所以我们就没必要让子进程进行回收了

    让每一个主进程地下都存活8个子进程,

    5*8=40个子进程,一个进程站30多兆内存,加起来也就1-2G

    做这么多不同的配置文件,目的就是让他监听不同的端口。我们可以看到php-fpm.conf监听的是9000端口-如下图。在php-fpm9001.conf里面应该监听的就是9001端口,其他同理。

    启动的时候我们写一个脚本,-y代表,选择使用什么配置文件启动php

    执行该脚本之后,执行ps aux |grep php会发现有80个进程严阵以待,等待着请求呢

    修改nginx的配置文件,添加如下

    test.php在 203上,位置为/var/www

    关防火墙

    服务器集群与负载均衡搭建完毕

    1:问题  C-->A 的mysql连接很慢

    解决: my.cnf中的[mysqld]节点中,添加

    skip-name-resolve   // 这句话使mysql连接时忽略解析域名,在制定Mysql权限时,只能根据IP限制,不能根据域名限制.

    2: 问题  当memcache中没有相应的数据,从后台回调数据时,

    http的状态码是404,(虽然内容正常),这样不利于SEO

    解决: nginx/conf/nginx.conf

     error_page 404  =200 /callback.php;  // 这样 404被改写成200来响应中

    压力测试:

    模拟 前0-10万是热数据,

    10-20万是冷门数据

    请求热数据 0-10,请求9次

    请求准予数据 请求1次,     -----100万次的请求.

    优化思路:

    nginx响应请求

    1:建立socket连接

    2: 打开文件,并沿socket返回.

    排查问题,也要注意观察这两点,

    主要从系统的dmesg ,和nginx的error.log来观察

    优化过程

    1:判断nginx的瓶颈

    1.1: 首先把ab测试端的性能提高,使之能高并发的请求.

    易出问题: too many open files

    原因 :  ab在压力测试时,打开的socket过多

    解决: ulimit -n 30000 (重启失效)

    观察结果: nginx 不需要特殊优化的情况下, 5000个连接,1秒内响应.

    满足要求,但 wating状态的连接过多.

    1.2: 解决waiting进程过多的问题.

    解决办法: keepalive_timeout = 0; 

    即: 请求结果后,不保留tcp连接.

    在高并发的情况下, keepalive会占据大量的socket连接.

    结果: waiting状态的连接明显减少.

    1.3: 解决服务端 too many open files

    分析: nginx要响应,

    1是要建立socket连接,

    2 是要读本地文件

    这两个者限制.

           
         
       
     

     

    由上图可看出,nginx的问题容易出在2点上:

    1: nginx接受的tcp连接多,能否建立起来?

    2: nginx响应过程,要打开许多文件 ,能否打开?

    第1个问题: 在内核层面(见下)

    第2个问题 (见下)

    系统内核层面:

    net.core.somaxconn = 4096 允许等待中的监听

    net.ipv4.tcp_tw_recycle = 1  tcp连接快速回收

    net.ipv4.tcp_tw_reuse = 1    tcp连接重用  

    net.ipv4.tcp_syncookies = 0  不抵御洪水攻击

    ulimit -n 30000

    Nginx层面:

    解决: nginx.conf 下面: work_connection 加大

    worker_connections  10240;

    Worker_rlimit_nofiles 10000;

    Keepalive_timeout 0;

    Nginx---->php-fpm之间的优化

     

     

           
         
       
     

     

     

    n

               
       
     
         
     
         

     

    如上图,在很多个nginx来访问fpm时, fpm的进程要是不够用, 会生成子进程.

     

    生成子进程需要内核来调度,比较耗时,

    如果网站并发比较大,

    我们可以用静态方式一次性生成若干子进程,保持在内存中.

     

    方法 -- 修改php-fpm.conf

    Pm = static  让fpm进程始终保持,不要动态生成

    Pm.max_children= 32  始终保持的子进程数量

    Php-mysql的优化

     

    Linux机器下 ,php 通过IP连接其他mysql服务器时,容易出的问题

    能ping能,但connect不到.

     

     

    一般是由:mysql服务器的防火墙影响的.

     

    并发1万连接,响应时间过长.

     

    优化思路: 同上的nginx

    1: 内核层面,加大连接数,并加快tcp回收

    2: mysql层面,增大连接数

    3: php层面,用长连接,节省连接数

    4: 用memcached缓存,减轻mysql负担

     

    具体:

    1.1  , PHP服务器增大 ulimint -n选项

    1.2 mysql服务器内核配置

    添加或修改如下选项

    net.ipv4.tcp_tw_recycle = 1

    net.ipv4.tcp_tw_reuse = 1

    net.ipv4.tcp_syncookies = 0

     

    # syscttl -p 使修改立即生效

     

    2.1  修改mysql.cnf

    Vi  /etc/my.conf

    # service mysqld restart 重启mysql

     

    3.1 PHP层面 ,用长连接

    Mysql_connect ---> mysql_pconnect

    注: pconnect 在PHP以apache模块的形式存在时,无效果.

    Nginx+phjp+mysql+nginx

    在引入memcached后,性能提升不明显,甚至还略有下降

     

    memcached使50%的请求变快了,但是一部分,反倒慢了.

    原因在于--PHP->memcached也要建立tcp连接,代价挺高,

    但缓存了数据之后,就省去了mysql的查询时间.

     

    总结: memcached适合存复杂的sql,尤其是连接查询/模糊查询的sql结果

     

    Memcached服务器的优化(集中在内核的ipv4设置上,不再重复)

     

     

    d号服务器

     

     

     

     

     

     

     

    4台机器防火墙全部关掉

  • 相关阅读:
    jquery 序列化form表单
    nginx for windows 安装
    nodejs idea 创建项目 (一)
    spring 配置 shiro rememberMe
    idea 2018 解决 双击shift 弹出 search everywhere 搜索框的方法
    redis 在windows 集群
    spring IOC控制反转和DI依赖注入
    redis 的安装
    shiro 通过jdbc连接数据库
    handlebars的用法
  • 原文地址:https://www.cnblogs.com/mrxiaohe/p/6811095.html
Copyright © 2011-2022 走看看