zoukankan      html  css  js  c++  java
  • 记一次惊心动魄的上线问题

    项目上线了,跑了一段时间,就出现卡死的情况。
    一看服务器的CPU或者内存并没有多高。
    后来重启了一下Nginx和php-fpm后就正常了。
    通过查看Nginx错误日志104: Connection reset by peer ,发现需要修改配置。
    nginx的buffer太小,timeout太小。

    client_header_buffer_size 5m;
    large_client_header_buffers 4 5m;
    client_body_buffer_size 20m;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 128k;
    fastcgi_busy_buffers_size 256k;
    gzip_buffers 16 8k;
    proxy_buffer_size 64k;
    proxy_buffers 4 128k;
    proxy_busy_buffers_size 256k;
    
    keepalive_timeout 240;
    fastcgi_connect_timeout 600;
    fastcgi_send_timeout 600;
    fastcgi_read_timeout 600;
    
    proxy_connect_timeout 600s;
    proxy_send_timeout 1200;
    proxy_read_timeout 1200;
    

    修改后,重启Nginx。
    风平浪静的时间久了。
    可是,过了一段时间,又出现问题了。

    日志继续监控者。

    后来继续排查,发现接口中使用了Curl方法。

    优化前 ,

    // 通过POST方式发送json数据
    static public function doPostJson($url = '', $param = [] ,$contentType = 'json') {
            $ch = curl_init();
            // 请求地址
            curl_setopt($ch, CURLOPT_URL, $url);
            // 请求参数类型
            $param = $contentType == 'json' ? urldecode(json_encode($param,JSON_UNESCAPED_UNICODE)) : http_build_query($param);
            // 关闭https验证
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            // post提交
            if($param){
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
            }
            // 返回的数据是否自动显示
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            // 执行并接收响应结果
            $output = curl_exec($ch);
            // 关闭curl
            curl_close($ch);
            return $output !== false ? $output : false;
    }
    

    优化后,

    // 通过POST方式发送json数据
    static public function doPostJson($url = '', $param = [] ,$contentType = 'json',$timeout=3) {
            $ch = curl_init();
            // 请求地址
            curl_setopt($ch, CURLOPT_URL, $url);
            // 请求参数类型
            $param = $contentType == 'json' ? urldecode(json_encode($param,JSON_UNESCAPED_UNICODE)) : http_build_query($param);
            // 关闭https验证
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_TIMEOUT	, $timeout);
            // post提交
            if($param){
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
            }
            // 返回的数据是否自动显示
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            // 执行并接收响应结果
            $output = curl_exec($ch);
            // 关闭curl
            curl_close($ch);
            return $output !== false ? $output : false;
    }
    

    之前没有timeout设置,导致获取别人信息的时候会一直无法结束。多个这样的curl操作之后,直接导致nginx的buffer被用完了,直接死掉。
    至此,终于风平浪静了。
    发现问题,解决问题。需要经验。
    平时写代码规范,少留坑。话说,不经历大风大浪也不知道该如何优化。
    首页访问时间长,占用Nginx服务,可以放入Redis缓存当中。
    Nginx错误日志,可以排查问题所在。
    Mysql慢查询日志,可以优化查询Sql,添加索引。
    查询慢,会用户体验不好,加大资源消耗。(CPU,内存)
    如果用户量大,日志文件会快速堆积,导致服务器空间不足。
    需要定期清理,写shell脚本。
    这次经理,惊心动魄,学会了发现问题,解决问题。
    感受了,代码,服务器环境,数据库优化,系统架构等方面的知识。
    感受到了日志对于排查错误的重要性。
    日志,让问题更加的直观。
    日志,可以更好的监控用户量。
    量大了,问题都出现了。
    百万pv,需要一个优秀的系统架构,强大的服务器,健壮的代码,优质的算法。
    百万pv,有点意思。

  • 相关阅读:
    Java annotation
    子类 父类强转 HttpServlet service实现
    父类 子类 强转
    HttpServlet Service方法
    java go
    IO写 PrintWriter
    IO读 BufferedReader+FileReader
    Java NIO-3
    心跳包(HeartBeat)
    Git学习笔记(一)
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/10209408.html
Copyright © 2011-2022 走看看