结合我工作中碰到的运维问题,总结一下Linux下server常见的运维问题以及定位方式。这里的server主要指自主开发的逻辑server,web srv因为通常采用通用的架构所以问题比较少。

逻辑server通常的处理能力在3k/s - 1w/s之间,因业务特点而不同。逻辑server一般是自主开发的,虽然在上线前大都经过功能和压力测试,但放到现网环境上部署后还是难免会出现一些问题,有些问题是在灰度发布时就可以发现,而有些问题则是一个漫长的暴露过程。下面先总结一下大致的问题分类和定位方法。

    1. 程序BUG如fd泄漏或内存泄漏

业务上线前一定要做压测,同时查看进程消耗的内存与fd数,结合业务特性分析fd使用量是否合理,同时观察内存使用是不是最终会趋于稳定的值,如果一直增加,就肯定有泄漏。

fd泄漏确认方法是:ls /proc/pid/fd -al | wc,可以看到单个进程使用的fd数,观察是否一直在涨长,如果没有最终达到一个稳定值,则可以确认存在泄漏。同时可以cat /proc/net/sockstat观察整体的fd使用数量是否一直在涨长,通常32位的机器,fd超过10W时系统会到达瓶颈。

内存泄漏确认方法是:top 看进程使用的RES 和 SHR,观察是否一直在涨长,如果没有最终达到一个稳定值,则可以确认存在泄漏。同时可以看下mem的使用量是否一直在增加。内存泄漏最终的结果是使用到的swap分区,一旦出现这种情况,cpu的wa字段会出现远大于0的情况,表明cpu阻塞在等待输入输出上。

2. 业务自然增长

这一点依赖于对请求数的统计,通过对前后几天的对比,不难确认是否是业务自然增长,单机请求量上升使系统出现瓶颈,这种问题通过扩容可以轻松解决,但最好的办法是对系统的容量和关键参数如cpu/mem/eth加上监控,能够做到提前告警,这样不至于在出问题的时候紧急扩容。

3. 特性变更导致用户行为异常

举个例子,有一次我在升级server时,基于性能的考虑,少返回了一个已无效的字段,灰度升级一台机器后,发现系统负载升高了3倍,当时的第一反应是有bug,使到cpu的使用突增,但vmstat发现 升级前cpu使用率 usr 和 sys大致是 14  7,升级后为 42 21,大致同比增长了3倍,再看一下请求数,发现请求数也同比增长,可见,是某些原因达致用户在重试。

因为上线前经过功能测试,所以正常用户的功能应该没有问题,对比这些的版本发更,发现有可能是少返回了一个字段,使外挂用户解析失败而不停重试,因此重新加上字段后再次发布,问题解决。从那次之后,总结了一点,当返回给用户侧的数据出现字段变更时,一定要灰度发布确认是否影响到外挂用户,如果有影响的话可以返回通过假数据解决。

4. 系统参数配置不当

举个例子,一段时间发现在访问高峰时段,进程会出现申请fd失败的情况,由于某些接口采用短连接,每次处理都需要申请fd、处理、释放fd,后来查看了系统参数,发现/proc/sys/net/ipv4/tcp_tw_recycle 和 /proc/sys/net/ipv4/tcp_tw_reuse都配的是0,0表示不开启加快回收fd和复用time_wait状态的fd,导致短连接关闭后,fd大面积处在time_wait状态,因些新的请求由于申请不到fd而失败,通过调整系统参数后问题解决。

5. 编码问题导致系统处理能力较差

     其实这个范畴的不能算是运营问题,但是处理能力较差的系统会很容易到达瓶颈。在编码过程中,一定要注意避免无谓的开销,特别是系统调用等。这里我总结了几条供大家参考:配置只解析一次,然后常驻内存或共享内存;常用的工具类如上报、写日志等,使用static或单件模式,保证只初始化一个;尽量采用长连接,减少fd申请、建连接、释放带来的开销;通知等非关键可丢失的消息使用udp,只发不收;不打印不必要的日志,而且要循环写,防止日志文件过大时出错;外部接口超时尽量短,防止进程因外部接口问题被挂住;单个进程的设定最大处理时长,保证系统最差情况时的处理能力;少用time、stat等系统调用。

系统调用方面,可以通过strace -c统计系统调用次数和耗时,从而对业务逻辑优化。strace -c的使用方法

这里举个例子,我有一次strace -c了一个处理进程,发现stat函数的cpu使用率非常高,然后strace跟踪了一下进程的系统调用发现,该进程用到了一个统计上报的类,类本身是用static初始化的,但类的上报接口中,每次都会初始化一个对象,对采样进行分析,并进行上报,这时会解析一次采样配置文件同时再解析一次上报配置文件,所以虽然类本身是static但是已经没有意义了,对象还是每次都会初始化,后来改造了一下,把接口中的对象用指针代替,只在第一次接口调用时初始化,再次调用时,判断指针非NULL,则直接使用。优化后,发现系统的cpu使用下降了近20%,可见,减少无谓的系统调用对系统的处理能力是有很大提升的。

以上总结了常见的运维问题和定位方法,相信大家大致有一套自已定位问题的方法,这里我谈下我定位问题的基本流程,供大家参考:

1. 查看日志

通过查看系统日志,可以第一时间确定是不是业务逻辑或外部接口出了问题,并可以结合代码进程核实。

2. 是否fd>10W

cat /proc/net/sockstat,观察tcp_use字段,如果持续增长而不趋于稳定说明fd泄漏或连接数过多,>10w时系统会出现异常。

3. 负载分析

首先用vmstat 1,观察cpu 、swap和r字段,大致可以分为以下几种情况:

cpu的wa字段远>0,并且swap的si字段远>0,说明已经用到了交换分区,这时通过top观察进程的RES和SHR字段,如果RES字段很大,并且持续增长,可以确认是存在内存泄漏。

cpu的usr和sys成比例比较高,r字段值也比较高,而swap使用量为0,说明可能是请求量有变化,这时核对请求量数据,是否成比例增长,如果是成比例增长的话,可以确认是请求量增大的原因,这时要根据几天的请求量数据确认是突增还是自然增长。

运维无小事,在系统运维过程中,出现的问题可能五花八门,但系统的接入和处理能力相关的关键指标其实并不多,只要把握的关键点,就不难定位出问题所在。更多的方法、心得与体会,欢迎大家一起探讨。

linux平台下server运维问题分析与定位的更多相关文章

  1. Linux平台下Lotus Domino服务器部署案例

    Linux平台下Lotus Domino服务器部署案例 几年前我写了篇<RHAS2.1下安装中文LotusDominoR6.5图解>这篇文档被多个大型网站转载,曾帮助过很多公司系统管理员部 ...

  2. Linux实战型企业运维工程师试题测评

    Linux实战型企业运维工程师试题答案 作者:尹正杰      最近在网上看到了一套有意思的面试题,我们一起来看一下这些题怎么破吧,哈哈~我先放在这里,有时间了一起来看看.多学点东西终究是没有坏处的! ...

  3. Linux平台下:块设备、裸设备、ASMlib、Udev相关关系

    对磁盘设备(裸分区)的访问方式分为两种:1.字符方式访问(裸设备):2.块方式访问 Solaris平台 : 在Solaris平台下,系统同时提供对磁盘设备的字符.块方式访问.每个磁盘有两个设备文件名: ...

  4. 亿级SQL Server运维的最佳实践PPT分享

    这次分享是我在微软的一次分享,关于SQL Server运维最佳实践的部分,由于受众来自不同背景,因此我让分享在一个更加抽象的角度进行,PPT分享如下: 点击这里进行下载

  5. 在linux平台下,设置core dump文件属性(位置,大小,文件名等)

    在linux平台下,设置core dump文件生成的方法: 1) 在终端中输入ulimit -c 如果结果为0,说明当程序崩溃时,系统并不能生成core dump. 2) 使用ulimit -c un ...

  6. Linux平台下Ntop流量监测安装,并实现Netflow全过程

    Linux平台下Ntop流量监测安装,并实现Netflow全过程 更多原创教学视频详见: http://you.video.sina.com.cn/m/1443650204 本文出自 "李晨 ...

  7. Python Linux系统管理与自动化运维

    Python Linux系统管理与自动化运维 前言 第1章Python语言与Linux系统管理1 1.1Python语言有多流行1 1.2Python语言为什么流行3 1.3Python语言有什么缺点 ...

  8. Linux下性能调试工具运维笔记

    作为一名资深的linux运维工程师,为方便了解和追求服务器的高性能,如cpu.内存.io.网络等等使用情况,要求运维工程师必须要熟练运用一些必要的系统性能调试工具,liunx下提供了众多命令方便查看各 ...

  9. SystemLogParser ArcGIS Server运维工程师的好助手

    单位使用ArcGIS Server发布了众多GIS服务,作为系统运维工程师,一直希望能有一种便捷的方式能获得服务的访问情况,Esri推出的SystemLogParser这款小程序就是不错的辅助工具,而 ...

随机推荐

  1. MYSQL数据删除数据,物理空间没释放

    当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除了表的一大部分数据,或者如果已 ...

  2. 【Kafka】Kafka-分区数-备份数-如何设置-怎么确定-怎么修改

    Kafka-分区数-备份数-如何设置-怎么确定-怎么修改 kafka partition 数量 更新_百度搜索 kafka重新分配partition - - CSDN博客 如何为Kafka集群选择合适 ...

  3. 如何配置官方peerDroid,使其运行起来

    一.Peer Droid是JXME协议到android平台的移植,开发者可以利用它来实现android设备以及传统PC机通讯的应用程序,peerDroid的官方demo主要是实现PC端peer和and ...

  4. Using Timers in MFC Applications

    Timer Events in MFC Applications Event timers are always handy to have around and useful in nearly e ...

  5. 例子:使用Grunt创建一个Node.js类库

      创建一个文件夹. 打开命令行或者powershell, 运行npm init,根据提示填入package的信息. 在文件夹中创建index.js文件. /*! * mymongolib * Cop ...

  6. XenServer修改DNS

    XenServer没法直接修改DNS,感觉好奇怪啊 修改方法: 1.进入命令行:  2.执行命令:      # xe pif-list 列出网卡的UUID.  3.执行命令:      # xe p ...

  7. POI中setDefaultColumnWidth方法不起作用的原因

    sheet.setDefaultRowHeight((short) (2 * 256)); //设置默认行高,表示2个字符的高度 sheet.setDefaultColumnWidth(17);   ...

  8. 编程实战——电影管理器之利用MediaInfo获取高清视频文件的相关信息

    随着高速(20M)宽带.HTPC.大容量硬盘(3T)的普及,下载高清片并利用大屏幕观看也成为普通的事情. 随着下载影片的增多,管理就有了问题,有时在茫茫文件夹下找寻一个影片也是一件费时费力的事. 于是 ...

  9. (算法)Game

    题目: Jeff loves playing games, Gluttonous snake( an old game in NOKIA era ) is one of his favourites. ...

  10. Linux FastDFS 分布式文件系统安装

    Linux FastDFS 分布式文件系统安装 2013 年 3 月 11 日 – 09:21 | 930 views | 收藏  (No Ratings Yet) FastDFS是一款类Google ...