我相信很多程序员都会有这种“线上服务器老是卡”等烦恼,那我今天给大家讲讲该如何优化线上服务器老是卡的问题。

听多了架构优化,数据库优化,今天我们来聊聊服务器优化。

我们开发的软件服务需要在服务器上运行,所以服务器性能代表了软件的性能上限,因此服务器性能调优是个十分重要的环节,然而大部分同学对服务器性能调优关注的较少,今天从3个部分对服务器性能调优进行介绍,分别是:服务器配置选择,服务器负载分析,服务器内核参数调优。

服务器配置选择

服务器一般是由CPU、内存、磁盘和网卡组成,因此选择服务器配置就是选择CPU核数、内存大小、磁盘大小及类型、网络带宽。但是,服务器配置的选择是很难标准化的,也就是说很难推断出“一台需要达到1000TPS的后端服务器”的配置应该是什么样的。因为软件的最终运行性能与软件的实现方式是紧密相关的,即使是同一个后端应用程序中的两个接口,由于具体功能的差别,性能也会有所差别。

因此,服务器配置的选择应该基于具体的测试结果。一开始可以选用配置较低的服务器做调优和测试,并以该服务器的测试结果作为选择服务器的依据。

以一个订单业务为例,经过测试后,一台配置为4核 CPU 、16GB内存、10Mbps带宽、50GB机械磁盘的服务器的测试结果为:支持50并发量和300TPS吞吐量(增大并发量后会出现超时报错)。而在压力测试过程中, CPU 的使用率接近75%,内存使用率在 50%以下,带宽使用率在50%以下,除去日志以外无磁盘操作。

因此可以认为,一台配置为4核 CPU ( CPU 使用率需要在75%以下)、8GB内存(内存使用率可以接近100%)、 5Mbps 带宽(带宽使用率可以接近100%)的服务器,可以满足订单接口支持50并发量、300TPS吞吐量的压力。

如果需要达到200并发数、2400TPS吞吐量的目标的话,则需要8台配置为4核 CPU 、8GB内存、5Mbps带宽的服务器,或者1台配置为32核 CPU 、64GB内存、40Mbps带宽的服务器。当然,最终的服务器配置还是需要通过测试来验证。

注意:在以上订单接口的例子中,后端服务器和数据库等服务器需要一起调试,避免后端服务器性能过剩,而数据库等服务器性能不足的情况发生。另外,以上选择服务器配置的方法不一定适用于所有场景,请斟酌参考。

服务器负载分析

在性能调优时,需要先对服务器负载进行分析,通常而言,我们主要分析CPU使用率、内存使用率、磁盘I/O,服务器负载和带宽使用情况。

CPU使用率

CPU使用率反应的是CPU的忙碌情况。当CPU达到100%时,部分进程会进入等待状态,CPU暂时不会对其进行处理。在实际情况下,为了应对一下突发性的请求压力,服务器CPU使用率一般需要在75%以下。如果一台服务器的CPU使用率多次高于75%,这时候就考虑增加新的服务器。

监控CPU使用率我推荐大家使用htop工具,可以非常直观看到CPU使用率、内存使用率、及负载等信息。

使用htop查看CPU负载

首先我们需要安装htop,以centos为例,安装命令如下:

yum install htop -y

安装完成后我们就可以通过htop命令观察CPU负载了

htop

输入htop命令后我们可以很直观的看到CPU负载情况,该命令的CPU使用率会以多个核作为单位进行显示。操作系统机会自动分配多个核的负载,当所有核的CPU使用率都超过75%时才能认为服务器的CPU使用率已经超过75%。

cpu负载

如上图所示,这是一个4核CPU服务器,在截图的时候其中3核CPU使用率都超过了75%,再观察一会发现所有CPU的使用率都在85%左右徘徊,说明CPU负载很高了,需要考虑增加新的服务器。

内存使用率

内存使用率反应的是内存的使用情况。内存用于存放程序的代码及数据,一般分为物理内存和虚拟内存,其中物理内存指的是服务器的内存,而虚拟内存指的是硬盘的一块空间。当物理内存使用率达到100%时将会使用虚拟内存。需要注意的是,虚拟内存的读写速度远远低于物理内存,如果程序被放在了虚拟内存执行,那么程序的执行效率会变得很低。

一般而言,服务器的物理内存应该保持在80%以下,虚拟内存使用率保持在0%。

服务器内存使用情况还是可以通过hop工具进行查看

内存使用率

上面显示了服务器的内存使用情况:总内存16G,使用了10G左右,内存使用率62%,可以继续使用,同时关闭了Swap虚拟内存。

在下MEM%栏中显示了单个进程的内存使用率。

磁盘I/O

磁盘I/O指的是磁盘的读写,在软件系统中,日志、文件操作、数据库操作都会造成磁盘读写压力,其中又以数据库操作为甚,在高并发情况下往往数据库会首先成为系统的瓶颈。

磁盘监控我推荐大家使用iostat工具,可以很方便查看磁盘的使用情况。

使用iostat查看磁盘I/O

首先我们需要安装iostat,以centos为例,安装命令如下:

yum install sysstat -y

安装完成后我们就可以通过iostat命令磁盘使用情况了。

# 查看磁盘总体读写情况, 1代表每1秒读取一次数据
iostat -x 1

磁盘IO

输入iostat命令后,磁盘总体读写情况如上所示。磁盘负载主要关注2个指标:%idle%util

  • %idle:表示CPU除去等待磁盘I/O以外的空闲时间百分比,这个指标应该要保证在70%以上

  • %util:该设备用于I/O操作的时间百分比,这个指标需要保证在70%以下,当到达100%时表示已经满负载。为了降低磁盘负载,可以采用性能更高的磁盘(OSD,PCIE)或者降低磁盘的操作频率(异步写、合并写)

平均负载

平均负载指的是单位时间内平均的活跃进程数,是一个表示服务器负载的指标。一般情况下需要保证平均负载的值小于当前服务器的CPU核数。

同样的,查看服务器平均负载我们也可以使用htop命令

在这里我们主要关注Load average指标,上图有3个数字,分别代表1分钟,5分钟,15分钟的平均负载。

一般情况下服务器的平均负载需要小于当前服务器的CPU核数,为了应对突发状况,服务器的平均负载应该在75%即3 以下,很显然,上图这台服务器平均负载超过了75%,需要考虑提升性能了。

网络使用情况

网络使用情况也是监控的重要指标。当带宽不足时会大大增加请求的响应时间。为了防止突发性并发压力,应该保证服务器的带宽使用率在80%以上。这里需要注意的是,物理网卡限制了服务器所能使用的最大宽带。

查看网络使用情况我推荐使用nload工具。

使用nload查看网络

首先需要安装nload,以centos为例

yum install nload -y

安装完成后我们直接运行nload

nload

输入nload命令后,网络使用情况如上图所示。其中,网络使用情况分为流入网卡的数据与流出网卡的数据。流入网卡的对应下行带宽的网速,流出网卡的数据对应上行带宽的网速。如果 “当前网速” 持续接近 “最大网速” 时,代表带宽使用率已经接近100%。

指标说明:

  • Curr:当前网速

  • Avg:平均网速

  • Min:最小网速

  • Max:最大网速

  • Ttl:总流量

服务器内核参数调优

光有强大的物理性能是不够的,还需要对内核参数进行调优,这样才能在高并发压力下充分体现服务器应有的性能。当然,并不是所有的服务器都需要做高并发性能调优,一般来说,只需要对要处理高并发请求的服务器进行内核参数调优即可,常见的包括:前端服务器,后端服务器,数据库服务器。

服务器常见的调优参数主要有两个:单个进程最大打开文件数 和 TCP相关设置。

单个进程最大打开文件数

修改单个文件最大打开文件数,只需要编辑/etc/security/limits.conf文件,在文件末尾加上以下四句

* soft   nofile  65535
* hard  nofile  65535
* soft  nproc   65535
* hard  nproc   65535

其中* 代表所有用户,65536代表修改的值,重启后生效。

TCP相关设置

修改TCP相关参数,可以优化TCP高并发通信,编辑/etc/sysctl.conf文件,添加以下内容

# 为防止洪水攻击,高并发系统需要将此项关闭
net.ipv4.tcp_syncookies = 0# 开启TCP连接重用,允许处理TIME-WAIT状态的连接重新用于新的TCP连接
net.ipv4.tcp_tw_reuse = 1# 开启快速回收TCP连接中处于TIME-WAIT状态的连接
net.ipv4.tcp_tw_recycle = 1#修改超时时间( s ),该值表示如果连接由本端关闭,则连接处于 FIN-WAIT-2状态的时间为
net.ipv4.tcp_fin_timeout = 30#当 keepalive(长连接)启用的时候,TCP发送 keepalive 消息(探测包)的时间间隔( s ),默认为2个小时
net.ipv4.tcp_keepalive_time =1200#服务器对外连接的端口范围,影响该服务器与其他服务器的连接数
net.ipv4.ip_local_port_range =102465535#SYN队列的长度,可以容纳更多等待连接的网络连接数,默认为1024
net.ipv4.tcp_max_syn_backlog = 65535#保持 TIME_WAIT 状态连接的最大数量,如果超过此值,TIME_WAIT 将立刻被清除并打印警告信息,默认为180000
net.ipv4.tcp_max_tw_buckets =5000#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog =65535# TCP最大连接数
net.core.somaxconn = 65535#预留用于接收缓冲的内存默认值(字节)
net.core.rmem_default = 8388608#预留用于接收缓冲的内存最大值(字节)
net.core.rmem_max = 16777216#预留用于发送缓冲的内存默认值(字节)
net.core.wmem_default = 8388608#预留用于发送缓冲的内存最大值(字节)
net.core.wmem_maX = 16777216#避免时间戳异常
net.ipv4.tcp_timestamps = 0#系统中最多有多少个 TCP 套接字不被关联到任何一个用户文件句柄上,如果超过这个数字,连接将即刻被复位并打印警告信息,这个限制仅仅是为了防止简单的DoS 攻击
net.ipv4.tcp_max_orphans =3276800

线上服务器老是卡,该如何优化?相关推荐

  1. window服务器cpu过高的排查_线上服务器发生CPU占用率过高应该如何排查并定位问题?...

    国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...

  2. 原创|面试官:线上服务器CPU占用率高如何排查定位问题?

    国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...

  3. 服务器定位cpu高占用率代码php,面试官:线上服务器CPU占用率高如何排查定位问题?,...

    面试官:线上服务器CPU占用率高如何排查定位问题?, 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果 ...

  4. 面试官:线上服务器CPU占用率高如何排查定位问题?

    开发十年,就只剩下这套架构体系了!! 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下:  ...

  5. 线上服务器登记的要点

    一家公司的线上服务器就是一家公司的大脑.如何公司的线上服务器出现任何问题,影响的将是公司的全部. 现在是互联网公司一般都有会将自己的服务器部署在云端,通过购买云服务来实现公司的生产.这样既可以减少运维 ...

  6. 线上服务器内存分析及问题排查

    转载自  线上服务器内存分析及问题排查 平常的工作中,在衡量服务器的性能时,经常会涉及到几个指标,load.cpu.mem.qps.rt等.每个指标都有其独特的意义,很多时候在线上出现问题时,往往会伴 ...

  7. 服务器cpu占用率高怎么解决,线上服务器CPU占用率高怎么办?

    如果线上服务器发生CPU占用率高时,应该如何排查并定位问题. 1.问题发现 本文整理自一个真实的案例,是楼主负责的业务,在一次大促之前的压测时发现了这个问题. 在每次大促之前,我们的测试人员都会对网站 ...

  8. 服务器主体信息截图,puppeteer实现线上服务器任意区域截图

    整个九月份由于业务繁重以及玩心颇重,一直没有机会来写一篇博文.而且笔者于十月一日将会举办人生大事--婚礼,现在家里筹办过程中只能抽出零碎的时间来写这篇文章. 关于服务端截图,这种使用场景非常少见,大多 ...

  9. 线上服务器内存飙升怎么排查?

    一.线上服务器内存飙升怎么排查? 1.通过top命令查看cpu.内存占用情况 2.通过shift+m命令按内存占用排序查看哪个java进程占用内存高,获取pid 3.通过jmap -histo pid ...

  10. 如何查看线上服务器日志

    公司的服务是部署在Linux上的,当线上出现各种问题的时候,我们肯定要先看线上日志,找到是什么问题再逐步排查.这里从最基础的步骤开始总结一下如何查看线上日志. 首先我用的是Xshell.Xshell可 ...

最新文章

  1. 【视频】React ReduxToolkit状态管理:创建store对象及redux调试工具的安装方法
  2. 限时领取!CSDN夏日惊喜礼包上线啦~
  3. java finalize逃脱_JVM【第十三回】:【Java对象存活------finalize()方法】
  4. poj3685 二分套二分
  5. Html.Partial和Html. RenderPartial用法
  6. 优雅统计代码耗时的4种方法!
  7. eclipse lombok插件安装_你干啥的?Lombok
  8. 2010年复旦MBA预审说明
  9. BCB中与路径文件名相关的几个函数!
  10. 心电信号matlab电路仿真实例,基于matlab的心电信号分析系统的设计与仿真.docx
  11. FPGA学习——32位booth算法乘法器设计(串行输入、液晶屏输出)
  12. 全国社会消费品零售总额ARIMA建模分析
  13. NV Fermi游戏架构全解析
  14. 噩梦射手 安装包资源包提供下载 Unity官方教程 Survival Shooter 资源已经失效了!? Unity3D休闲射击类游戏《Survival Shooter》完整源码
  15. Revit API之BoundingBoxXYZ的用法和剖面框(Section Box)
  16. [2018-01-12] laravel--路由(路由与控制器)
  17. mysqld_multi 没法stop
  18. json数据转换base64方法
  19. 基于javaweb的巡更巡检管理系统
  20. 特效笔记2--unity粒子系统的基本认识

热门文章

  1. 启用了被称为 HTTP 严格传输安全(HSTS)的安全策略,Firefox 只能与其建立安全连接
  2. Lowest Common Ancestor of a Binary Tree
  3. 《失业的程序员》(十二):潜意识的智商
  4. ARM9开发板连接鼠标和键盘
  5. 小米电视机如何重新匹配遥控器
  6. 网易云易盾正式成为“中国短视频与直播联盟”常务理事
  7. php将tiff转pdf_通过命令行界面将PDF,TIFF和其他图像格式批量转换为PDF,PDF可搜索和具有Power PDF Advanced的TIFF...
  8. 1965:【14NOIP普及组】珠心算测验
  9. 华为 任正非 2021年1月22日 最新内部电邮全文
  10. python玫瑰花数量的含义_玫瑰花数量代表的含义