服务端问题剖析浅谈

这是一篇很随性的浅谈,主要围绕着作为一个服务端程序员如何解决疑难杂症这个话题。我是一名使用java的程序员,在我的认知范围内,java还是擅长于服务端业务编程。即:拥有完善的解决企业级信息化问题的生态,适用于服务端非极端性能要求下的一种编程语言。这里的重点是:

  1. 生态健全,能够快速应对各种复杂业务。

  2. 面向服务端,众所周知java在客户端(浏览器、桌面端、嵌入式)领域做的不是很好,只有安卓还说得过去。

  3. 性能中立,现代jvm性能在理论上不次于c++,但中间件、操作系统等对性能、高并发要求苛刻的场景中,选择java作为开发语言的很少。
    所以对于80%的java程序员,可能就是写写业务代码。甚至在中国计算机行业环境下,不进入大厂是无法接触到高并发和大数据量的。导致自身技术无法提升,即使是死记硬背八股文,最后也只是停留在理论(N多天后就忘了),到头来也只是个干业务的java程序员。当然,进了大厂也不一定能接触到核心技术,一样是个普通的java程序员。所以对于很多人35岁就终结了职场生涯。
    不是java程序员还是什么?答:服务端工程师。
    为啥叫服务端工程师?一个优秀的程序员,不只局限于一种java语言,可以是多种语言或基于java语言能够做到极致,解决一切关于服务端相关的问题。这样的程序员,我认为可称为服务端工程师。其应该具有的能力和素质包括不限于:

  4. 用自己和团队所能把控的技术解决一切服务端需求(无论是纯业务的还是技术的)

  5. 具有独立的设计和思考能力,能够对技术实现方案提出质疑(无论是质疑别人还是自己)

  6. 负责、不要甩锅,但知道边界(在你的职责范围内切勿干涉别人的领域和负责的事)

  7. 能够解决一切服务端遇到的问题,这里包括不限于:

  • 自己和他人产生的问题:自己做的东西遇到问题自己要能解决,历史遗留的老系统(无数人写的屎山代码)在没有任何说明和帮助的情况下快速接手并解决问题。
  • 非功能性和功能性问题:功能性问题指的是业务问题。非功能性问题指的是性能、稳定性、可扩展性等技术问题。
    可能很多人认为,有架构师和基础架构组帮忙解决非功能性问题就够了,我只要能开发业务需求就可以了。如果你这样想,必定会面临35岁的噩梦。

上面四点对一个服务端工程师的定义,本文只想讨论:一个服务端程序员如何解决疑难杂症,即怎么能够解决一切服务端遇到的问题。
我认为一个优秀的服务端工程师,表现能力的时刻不只是设计和编码,很重要一点是解决问题的思路和手段。一般打法为:遇到问题->提出猜想->分析并验证->解决问题->复盘。
这个打法不是为了卷,而是为了解决问题并对自己掌握的知识做迭代更新。
提出猜想:根据过往的经验,先粗略评估出排查问题的方向,可以根据过往经验和理论知识去定。这样遇到问题不会手忙脚乱。
分析并验证:有了大体方向,需要使用工具、实验去印证方向是否正确。不正确,无法解决问题,退回第一步重新提出猜想,继续验证,直到能够给出解决问题的最终方案。
解决问题:有了最终方案,解决问题就简单了。
复盘:复盘不是为了追责举办一场批斗大会,而是总结解决问题的思路、分享经验。复盘不局限于形式,譬如写一个简单的分析过程分享给大家,甚至是自己总结成笔记(说出来、写出来远比自己大脑里想过一遍理解的更深刻)。
解决功能性问题取决于自己对业务的理解,对系统的理解。这两点通常是需要时间的,比如亲身参与过系统的设计和功能的开发,或过往经历有业务领域的知识储备。但有的时候并不是这么美好,比如:

  1. 你刚到一家新公司的第一天,领导不容分说就让你上手干活。
  2. 你接手了一个庞大的老系统,之前的研发人员都走了,没留下任何文档,而你对该业务领域并不熟悉。
    这时,你唯一能做的就是硬着头皮上,通过一些普适的技术手段对这个黑盒进行分析。
    解决非功能性问题取决于你对计算机基础技术的掌握程度,无论是在设计开发阶段还是上线后,基础牢靠的人总会提前发现问题并解决掉,或在出现问题时有独到的手段解决问题。基础本质上就是大学的课程:
  3. 数据结构与算法:设计开发阶段可以针对面临的问题,找出合适的算法。这不是说要自己写个多牛b的算法和数据结构,而是能否找出一个现成的东西(中间件、数据库、类库等)解决问题。比如了解redis的数据结构原理,选一个合适的结构存储你的数据,能够成倍加速你的应用性能。
  4. 操作系统:在面对高并发和大数据量涌入服务器的时候,操作系统也不是那么可靠。或者操作系统实现的机制中可以进行调优,加快应用的计算速度。
  5. 网络:我们都知道TCP是可靠传输的,但实际并不那么可靠。总会遇到丢包、超时重传等问题,会导致用户体验极差。我们要有能力排查这些问题。
  6. 编程语言基础:编程语言基础不只是语法规则,对jvm内存管理、线程、各种类库的深入理解,可以在出现问题时快速定位问题。
  7. 计算机组成原理:同样面对高并发和大数据量的情况,对CPU、内存、磁盘、网络的硬件工作原理有深入的理解,加上对操作系统的深入理解,能够加速解决一些极端的问题。

本质上,一个服务端工程师,不需要掌握多种编程语言,熟悉多种数据库、中间件的使用。上面的基础打牢靠了就非常不错了。任何一个大厂的面试,无论是八股文还是面试官的随性提问,都离不开这些基础。这种刁钻刻薄的问题不是为了卷,而是复杂系统,在高并发的流量冲击下,每一行代码都需要深思熟虑。

无论是功能性问题和非功能性问题,都可以使用的普适手段:

  1. run起来:即使是接手的屎山代码也要先跑起来,才能观察其内部机制。遇到线上问题,先考虑能否重放有问题的请求复现问题。
  2. 寻找可观测的手段:系统若是有链路跟踪,可以使用链路跟踪分析问题。没有可以尝试查找日志(可能需要熟悉操作系统命令),观察监控系统的各种指标(所以需要对常用的业务和非业务指标名词有基本的了解)。
  3. 使用一些工具:我很喜欢收集一些工具,比如观测CPU、内存、磁盘、网络的工具、jvm分析工具等。
    不得不说,对各种工具熟练使用,能够加快排查问题的速度。但对专业工具能够熟练使用的前提,是要有扎实的基本功和理论知识。所以我的建议是在你的职业生涯中,要不断加强基本功(数据结构与算法、操作系统、网络、编程语言基础、计算机组成原理
    我的团队曾在毫无准备的情况下,接手了一个遗留的老系统,这并不是我们所负责的业务领域,对其领域知识可以说为0。接手第一天就有业务方找来报各种线上问题,这个系统没有任何文档交接给我们。我们拿到问题后,是这样做的:
  4. 对用户请求使用tcpdump在服务器上进行抓包,观察里面的请求参数、请求URL,转换成curl命令尝试重放请求(这里要考虑是否对业务有损)
  5. 基于重放的请求,观察日志
  6. 根据请求参数和日志,找到代码的入口点,仔细分析每行代码的执行结果,从而解决问题
    另外一个真实场景,我们在热点流量的冲击下,偶现单机大量的熔断异常,导致个别机器接口请求错误率非常高。最初认为是调用下游接口过慢导致的熔断,找到下游同事一起排查,在下游的视角下其接口整体耗时并不高,在我们熔断的请求中他们接口耗时很低,并返回了正常的结果,所以问题出现在我们系统内部。我们是这样排查的:
  7. 观察监控系统中出问题的单机CPU、内存、网络等负载是否有飙升
  8. 观察gc日志,分析出现问题时间段的gc情况,是否stw时间过长
  9. 上面2点都没有异常,那么是不是请求线程执行慢了?使用jstack打印线程栈,发现死锁
  10. 根据死锁的栈,逐行去跟踪类库和Jdk源码,发现是dnsjava在做dns udp的情况下出现了死锁的bug(这个问题不是dnsjava,这是jdk1.8的一个bug)
  11. 解决办法:要么遇到了重启服务器,要么升级jdk版本,要么升级glibc版本
    上面俩个场景可以看到熟练掌握分析工具,扎实的基本功是很重要的一件事。我们遇到过很多千奇百怪的问题,人为导致的、操作系统或基础组件实现的bug、操作系统或jvm参数配置不正确等等。很多问题,很少的QPS或数据量是无法触发的。
    这里我也列出一些常用的工具:

CPU、内存、磁盘、网络

  • Linux基本命令:top、vmstat、ps、free、netstat、lsof、strace、/proc、/sys
  • 其他工具:bcc-tools、perf、sysstat、valgrind、systemtap、heap profiling、tcpdump、wireshark、Intel VTune Profiler

JVM

  • jdk自带工具:jstack、jstat、jps、jmap、jhat、HSDB、visualvm、jconsole
  • 其他工具:arthas、jprofiler、mat、gcviwer
  • 在线工具:gceasy、heaphero、perfma

日志分析

  • Linux基本命令:tail、grep、zgrep、zcat、awk、sed、less、more、sort、uniq
  • 其他工具:ELK

如果你对性能和各种疑难杂症分析有兴趣,推荐看的资料:
书:

  1. 性能之巅
  2. bpf之巅
  3. 高性能超标量CPU
  4. 现代CPU性能分析与优化
  5. 深入理解java虚拟机
  6. 垃圾回收的算法与实现
    一些优秀的网站和公众号:
  7. 开发内功修炼微信公众号
  8. 低并发编程公众号
  9. https://easyperf.net
  10. https://www.brendangregg.com
  11. https://heapdump.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/43879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cesium中获取高度的误区

this.ellipsoid viewer.scene.globe.ellipsoid; var cartesian viewer.camera.pickEllipsoid(e.position, this.ellipsoid);if(cartesian){// 苗卡尔椭球体的三维坐标 转 地图坐标(弧度)var cartographic viewer.scene.globe.ellipsoid.cartesianToCa…

<数据结构与算法>二叉树堆的实现

目录 前言 一、树的概念及结构 1 树的概念 2 树的相关概念 二、二叉树的概念及结构 1.二叉树的概念 2. 特殊的二叉树 3. 二叉树的性质 4.二叉树的存储结构 三、二叉树的顺序结构及实现 1.堆的性质 2.堆的插入 3.堆的实现 堆的结构体 HeapInit 初始化 HeapPush 插入 HeapPop 删…

【C++进阶】继承、多态的详解(多态篇)

【C进阶】继承、多态的详解(多态篇) 目录 【C进阶】继承、多态的详解(多态篇)多态的概念多态的定义及实现多态的构成条件(重点)虚函数虚函数的重写(覆盖、一种接口继承)C11 override…

solr快速上手:聚合分组查询|嵌套分组指南(十二)

0. 引言 solr作为搜索引擎经常用于各类查询场景,我们之前讲解了solr的查询语法,而除了普通的查询语法,有时我们还需要实现聚合查询来统计一些指标,所以今天我们接着来查看solr的聚合查询语法 1. 常用聚合查询语法 以下演示我们…

面试题-React(一):React是什么?它的主要特点是什么?

探索React:前端开发中的重要角色与主要特点 引言: 在现代前端开发领域,React已经成为最受欢迎和广泛使用的JavaScript库之一。它由Facebook开发并于2013年首次发布。随着时间的推移,React在开发社区中获得了强大的支持和认可。本…

画质提升+带宽优化,小红书音视频团队端云结合超分落地实践

随着视频业务和短视频播放规模不断增长,小红书一直致力于研究:如何在保证提升用户体验质量的同时降低视频带宽成本? 在近日结束的音视频技术大会「LiveVideoStackCon 2023」上海站中,小红书音视频架构视频图像处理算法负责人剑寒向…

legacy-peer-deps的作用

加入ui组件库,以element-ui为例子 安装命令: npm i element-ui -S 如果安装不上,是因为npm版本问题报错,那么就使用以下命令 npm i element-ui -S --legacy-peer-deps那么legacy-peer-deps的作用是? 它是用于绕过pee…

基于注意力神经网络的深度强化学习探索方法:ARiADNE

ARiADNE:A Reinforcement learning approach using Attention-based Deep Networks for Exploration 文章目录 ARiADNE:A Reinforcement learning approach using Attention-based Deep Networks for Exploration机器人自主探索(ARE)ARE的传统边界法非短视路径深度强化学习的方…

Python | Package | Python的三种包安装方式(pip/whl/tar.gz)

文章目录 PIP 安装与卸载Source 安装与卸载Whell 安装与卸载 PIP 安装与卸载 pip install xxx pip install xxxversion_numberpip install captcha pip install captcha0.4# XXX/anaconda3/envs/py373/lib/python3.7/site-packages pip uninstall captchaSource 安装与卸载 p…

C++音乐播放系统

C音乐播放系统 音乐的好处c发出声音乐谱与赫兹对照把歌打到c上 学习c的同学们都知道,c是一个一本正经的编程语言,因该没有人用它来做游戏、做病毒、做…做…做音乐播放系统吧!! 音乐的好处 提升情绪:音乐能够影响我们…

java语言B/S架构云HIS医院信息系统源码【springboot】

医院云HIS全称为基于云计算的医疗卫生信息系统( Cloud- Based Healthcare Information System),是运用云计算、大数据、物联网等新兴信息技术,按照现代医疗卫生管理要求,在一定区域范围内以数字化形式提供医疗卫生行业数据收集、存储、传递、…

动手学深度学习--基础知识上篇

🎈动手学deep learning ☁️本专栏会定期更新关于动手学深度学习的每章知识点的讲解,题目答案 👻如果喜欢,欢迎点赞,收藏 动手学深度学习-预备知识篇 线性代数篇 1-3题讲解 证明一个矩阵 A \mathbf{A} A的转置的转置…

安卓手机跑 vins slam (2)

既然选择把vins的代码移植到新工程,那么就需要先确定自己电脑的Android Studio的C开发环节是OK的,可以通过创建C的示例工程,能正常跑通做验证。 选择Native C 需要选择用C哪个版本, 这里通过百度搜索,slam 编译需要C 1…

电脑提示丢失(或找不到)msvcp120.dll解决办法

msvcp140.dll是Microsoft Visual C Redistributable的一部分,它是Windows操作系统中的一个动态链接库文件。这个文件包含了许多C标准库函数的实现,对于一些依赖C标准库的应用程序来说,msvcp140.dll是非常重要的。msvcp140.dll的主要用途是提供…

热电联产在综合能源系统中的选址定容研究(matlab代码)

目录 1 主要内容 目标函数 程序模型 2 部分代码 3 程序结果 1 主要内容 该程序参考《热电联产在区域综合能源系统中的定容选址研究》,主要针对电热综合能源系统进行优化,确定热电联产机组的位置和容量,程序以33节点电网和17节点热网为例…

CI/CD入门(二)

CI/CD入门(二) 目录 CI/CD入门(二) 1、代码上线方案 1.1 早期手动部署代码1.2 合理化上线方案1.3 大型企业上线制度和流程1.4 php程序代码上线的具体方案1.5 Java程序代码上线的具体方案1.6 代码上线解决方案注意事项2、理解持续集成、持续交付、持续部署 2.1 持续集成2.2 持续…

小白到运维工程师自学之路 第七十五集 (Kubernetes 企业级高可用部署)2

8、添加master节点 在k8s-master2和k8s-master3节点创建文件夹 mkdir -p /etc/kubernetes/pki/etcd在k8s-master1节点执行 从k8s-master1复制密钥和相关文件到k8s-master2和k8s-master3 scp /etc/kubernetes/admin.conf root192.168.77.15:/etc/kubernetes scp /etc/kubernet…

UAF释放后重引用原理

原地址:https://blog.csdn.net/qq_31481187/article/details/73612451 原作者代码是基于linux系统的演示代码,因为windows和Linux 内存管理机制上略有不同,该程序在Windows需要稍微做些改动。 Windows上执行free释放malloc函数分配的内存后…

Docker碎碎念

docker和虚拟机的区别 虚拟机(VM)是通过在物理硬件上运行一个完整的操作系统来实现的。 每个虚拟机都有自己的内核、设备驱动程序和用户空间,它们是相互独立且完全隔离的。 虚拟机可以在不同的物理服务器之间迁移,因为它们是以整…

淘宝搜索店铺列表API:关键字搜索店铺信息 获取店铺主页 店铺所在地 服务评级

接口名称:item_search_seller 基本功能介绍 该API可以通过传入关键字,获取到淘宝商城的店铺列表,支持翻页显示。指定参数page获取到指定页的数据。返回的店铺信息包括:店铺名、店铺ID、店铺主页、宝贝图片、掌柜名字、店铺所在地…