• 过载保护


    过载保护

    2012-06-26 13:04 by zhenjing, 115 阅读, 1 评论, 收藏编辑

    缘起

    某个线上系统平时非常稳定,当大量更新数据时,系统的服务就会严重超时。问题存在了一段时间,基本猜测系统超时和大量写入数据有关,但却无法给出确切的解释。为此已经写了2篇文章:

    linux性能监控
    linux的IO调度算法和回写机制

    问题解释

    问题的解释很简单:系统过载。由于系统定期更新大量数据,更新期间磁盘读IO性能很差,导致每个服务的时延极大增加,整个系统的吞吐量大幅降低。该系统没有采用合理的过载保护策略,导致后续的包全部超时!!!

    什么情况会导致系统过载?系统处理能力 < 请求量 = 系统过载。设计系统时都需要系统的处理能力,比如每秒的处理能力、请求峰值、平均处理时延等。这3个指标可很好地估计系统最大处理能力、需要多少机器提供服务、是否需要扩容等。但评估容易只关注 请求量峰值,而忽略系统处理能力的变化。从公式上看,系统处理能力降低同样会造成过载。

    过载成因基本就2种:超过硬件系统极限能力、超出软件系统的极限能力。超出硬件能力比较少见,重点关注软件系统:操作系统和应用软件。操作系统负责统一调配和管理硬件资源,应用系统通过系统调用使用机器的硬件资源,当对资源的使用超过操作系统所能承受的上限,将导致整体处理能力急剧下降。应用系统一般包括下列四种类型的瓶颈,某些应用系统可能同时包含2个及2个以上的瓶颈因素:

    CPU(计算密集型)
    MEMORY(内存消耗型)
    LOAD(大并发型)
    IO(包括两类,磁盘IO密集型如DISK、DB;网络IO密集型:流量、连接数等)

    系统瓶颈理论上是系统中最慢的系统资源,比如上述诸多资源中的一种,在突破瓶颈阀值时系统出现拐点,性能会急剧下降(底层原因比如进程调度频繁、网络拥塞、随机磁盘IO导致文件系统cache命中率下降及磁盘物理IO频繁---机械臂移动、SWAP换入换出频繁等等),因此识别系统各环节处理能力及其瓶颈至关重要。

    问题的解决

    解决该问题大概有以下几种思路:

    1)分散写;
    2)写时不提供服务;
    3)过载保护:丢弃超时的请求。

    一种简单的过载保护

    linux的网络包带有时间戳,可通过ioctl获取网络包的时间戳。该时间戳表示网络包接收时的时间戳(本机)。因此比较当前时间和网络包的时间戳即可判断请求是否超时,若超时,直接丢弃。这个办法可快速清空超时的请求,避免由于处理超时请求,导致后续的请求无法被正常响应。

     示例代码:

    复制代码
    int GetPkgTime(int sockfd, struct timeval *pkgTv)
    {
        struct timeval tv;
        int iRet;
        
        iRet = ioctl(sockfd, SIOCGSTAMP, &tv);
        if(iRet < 0)
        {
            return -1;
        }   
        
        *pkgTv = tv;
    
        return 0;
    }
    
    int IsPkgTimeout(int sockfd, int ms )
    {
        struct timeval tv;
        if( GetPkgTime( sockfd, &tv) != 0){
            return -1;
        }
    
        long pastTime = PostTime(&tv);
        if( pastTime >= ms * 1000){
            return 1;
        }
    
        return 0;
    }
    复制代码

    相关文章

    如何定位系统性能瓶颈和调优,参考: 性能调优攻略

    更多的过载保护,参考:浅谈过载保护


    作者:zhenjing.chen 
    出处:http://www.cnblogs.com/zhenjing/ 
    未注明转载的文章,版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    python学习笔记之九:模块和包
    python学习笔记之八:迭代器和生成器
    python学习笔记之七:魔法方法,属性
    python学习笔记之六:更加抽象
    python学习笔记之五:抽象
    python学习笔记之四:条件,循环和其他语句
    python学习笔记之三:字典,当索引不好用时
    python学习笔记之二:使用字符串
    yolo自己的数据集中LabelImg的安装出现No module named 'libs.resources'错误
    django2 rest_framework + vue.js + mysql5.6 实现增删改查
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2563614.html
Copyright © 2020-2023  润新知