linux平台下server运维问题分析与定位

结合我工作中碰到的运维问题,总结一下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,说明可能是请求量有变化,这时核对请求量数据,是否成比例增长,如果是成比例增长的话,可以确认是请求量增大的原因,这时要根据几天的请求量数据确认是突增还是自然增长。

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

时间: 2024-11-05 16:58:13

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

Linux服务器集群运维经验

公司大概有5000+以上的服务器节点,包括各种应用,我和同事共同维护大约2500+的服务器,主要包括一些视频cdn,直播视频cdn,webcdn和p2p服务器. 以下是自己在运维工作中的一点经验和看法,希望对大家有所帮助 1.       服务器型号的区分,为以后的统一化和标准化作硬件上的准备,很多人忽视这一点,其实如果这一点做得好会使后面的运维工作轻松很多,根据应用我们主要把服务器分为3中,cpu密集型,主要用于大量计算应用,比如p2p;内存密集型,用于cache类应用,比如squid,var

Linux平台下Java_Android开发环境的搭建

Linux 平台下安装JDK .Eclipse .Android SDK 说明 开发工具需自行去下载,此处就不再累述 该教程安装环境为 Ubuntu 14.04 x64 其他Linux操作方式基本相同 设计文件修改部分,请先备份要修改的文件,避免操作失误导致不能还原 Liunx 平台下区分大小写,输入文件名或路径建议复制避免不必要的错误 部分操作涉及root权限,为了避免麻烦 请直接使用 root权限操作 开启root权限: 1. sudo su root 2. 后面的提示中输入用户密码 安装

马哥2016全新Linux+Python高端运维班第三周作业作答

                    马哥2016全新Linux+Python高端运维班第三周作业                                           1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可.     [[email protected] ~]# who | awk '{print $1 $NF}'| uniq -d     [[email protected] ~]# who     yicx     :0  

Linux+Python高端运维班第二次作业

Linux+Python高端运维班第二次作业 1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可. [[email protected] ~]# who |cut -d" " -f1|uniq (unknown) root test1 [[email protected] ~]# who |cut -d" " -f1|sort -u root (unknown) wangyanglin 2.取出当前系统上被用户当作其默认shel

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

在linux平台下,设置core dump文件生成的方法: 1) 在终端中输入ulimit -c 如果结果为0,说明当程序崩溃时,系统并不能生成core dump. 2) 使用ulimit -c unlimited命令,开启core dump功能,并且不限制生成core dump文件的大小.如果需要限制,加数字限制即可.ulimit - c 1024 3) 默认情况下,core dump生成的文件名为core,而且就在程序当前目录下.新的core会覆盖已存在的core.通过修改/proc/sys

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

对磁盘设备(裸分区)的访问方式分为两种:1.字符方式访问(裸设备):2.块方式访问 Solaris平台 : 在Solaris平台下,系统同时提供对磁盘设备的字符.块方式访问.每个磁盘有两个设备文件名: 一个在/dev/dsk目录下,比如/dev/dsk/c1t1d1s1,当以这个设备名操作时,就是以块的方式操作磁盘: 一个在/dev/rdsk目录下,比如/dev/rdsk/c1t1d1s1,当以这个设备名操作时,就是以字符方式(裸设备方式r)操作磁盘 Linux平台 : 在linux平台下,缺省

关于Linux平台下的ZFS文件系统最新情况

Linux平台下的ZFS文件系统分类两个,一个是在用户空间实现的ZFS,一个是通过内核模块实现的ZFS. 用户空间实现的ZFS已经好几年没人维护了,且不说稳定性,单是性能就无法用,相关开发人员已放弃. 内核空间实现的ZFS一直在维护,美国有相关机构在内部使用,按照zfsonlinux上的开发者所说,早已经稳定了,可以在线上使用,但国内使用的人还是寥寥.可能最大的问题就是,由于Solaris自身发布协议和专利纠纷的限制,此项目的代码仍是基于CDDL发布的,因而不会进入主线内核,所以大家普遍感觉不是

Linux平台下Python的安装及IDE开发环境搭建

Linux平台下Python的安装及IDE开发环境搭建 1.Python安装 Python有2.X和3.X两个版本,由于2.X的版本较稳定,使用者也较多,本文选择使用Python 2.X版本. 安装步骤: (1) 下载Python安装包:https://www.python.org/downloads/ (2)  解压安装包:tar zxvf Python-2.7.10.tgz (3)  编译:./compile (4)  安装:make && make install 说明: ① 这样p

linux平台下Oracle database的安装与/etc/redhat-release

linux平台下,在安装oracle10.2.0.1的时候,不要修改/etc/redhat-release的内容. 而是要用runInstaller的一个参数去解决:-ignoreSysPreReqs.因为emc的多路径软件在安装时会读取该文件的内容,错误的内容会导致emc多路径软件安装失败.这也算是一个最佳实践吧. 版权声明:本文为博主原创文章,未经博主允许不得转载.