面试官考察性能优化问题的目的可能并不是要你设计一个性能很高的系统,而是为了全方位考察一个面试者的知识背景和实践能力。
1) 性能优化涉及的知识面既需要深度,同时又需要一定的广度
所以说,掌握了性能优化,实际上也代表着掌握了这些各方面的知识能力。
性能优化都是构建在操作系统、网络、算法、分布式系统等基础知识的大厦之上。只有深入掌握了这些基础知识,才能让你更好的掌握更高层次的技术,一通百通。
平均负载就是平均活跃进程数,包括
平均负载的计算方法是活跃进程数的指数衰减平均值。
平均负载并不是看起来那么直观,所以又有了 Pressure Stall Information (PSI[2]):
如下图所示,就是一个平均负载和 PSI 的对比关系:
虚拟内存空间
在这五个内存段中,堆和文件映射段的内存是动态分配的。比如说,使用 C 标准库的 malloc() 或者 mmap() ,就可以分别在堆和文件映射段动态分配内存。
malloc() 是 C 标准库提供的内存分配函数,对应到系统调用上,有两种实现方式,即 brk() 和 mmap()。
这两种方式,自然各有优缺点。
内存池解决了什么问题:
相关视频推荐
支撑亿级io的底层基石 epoll实战揭秘
10道面试必问的经典网络八股文,让你在面试中逼格满满
8个方面完善linux c/c++开发,再也不用全网搜刮了
免费学习地址:c/c++ linux服务器开发/后台架构师
【文章福利】需要C/C++ Linux服务器架构师学习资料加群812855908(资料包括C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg,大厂面试题 等)
磁盘和文件系统 I/O 是最常见的一类性能问题,比如数据库性能、Redis 性能、网络存储的性能等都跟 I/O 性能有直接关系。要理解 I/O 性能,当然还得从基础的原理开始,比如下图所示的 I/O 栈:
熟悉了原理,之后可以根据下图定位磁盘和文件系统 I/O 瓶颈
网络性能优化相对更难的原因包括
网络性能优化涉及面广,但也是构建分布式系统、微服务、云原生应用等必须要掌握的核心能力之一。在实际分析和优化网络性能时,可以按图索骥,根据 Linux 网络包内核协议栈处理路径和 Linux 通用 IP 网络栈的原理去逐步拆解分析。
下图是 Linux 网络包内核协议栈处理路径示意图:
下图是 Linux 通用 IP 网络栈的示意图:
要回答 Linux 到底最大支持多少并发连接,首先就要清楚 Linux 是通过什么方法来标识一个 “连接” 的。Linux 通过五元组来区分一个连接:协议、源 IP 地址、目的 IP 地址、源端口、目的端口。
对客户端来说,假设它要并发连接同一个服务,那就说明协议、源 IP 地址、目的 IP 地址和目的端口是固定的,唯一可变的是源端口。由于端口号是 16 位的,所以最大的并发连接数也就是 64K。
除此之外还有没有其他的限制的呢?实际上,端口号并不是唯一的限制,内核协议栈中还有很多东西限制最大的并发连接数:
对服务器端来说,又是另一种情况。服务器主要是接受客户端请求,所以协议、目的 IP 地址和目的端口号是固定的,可变的就是客户端源 IP 地址和源端口号。这样,最大的并发连接数也就是可用 IP 地址数量 x 可用端口号数量,即 2^48(IPv6 还会更多)。
跟客户端类似,除了五元组之外,内核协议栈还有很多因素会影响最大连接数。比如最大文件描述符数量、内存、Sokect 缓存、连接跟踪等等。
既然 TIME_WAIT 很恼人,为什么说它还是必要的呢?这就要从 TCP 的工作原理说起了,下图是 TCP 状态图。我们知道 TCP 有两个最基本的机制:三次握手和四次挥手,TIME_WAIT 就是在四次挥手过程中必备的一个状态。
从 TCP 状态图中可以看到,主动关闭的一方会进入 TIME_WAIT 状态(而被动关闭的一方会进入 CLOSE_WAIT 状态)。TIME_WAIT 状态之所以存在是为了解决网络中的异常问题,比如
TIME_WAIT 连接数量多了以后,会导致三个危害:
解决方法
容器内的应用其实也是普通的 Linux 进程,只不过这些进程做了一些隔离:
namespace 隔离包括 pid, net, ipc, mnt, uts, user 等。
普通的 Linux 进程默认情况下的隔离通常较少,但也并非没有隔离。作为操作系统最基本的功能之一,内存管理会给每个进程分配不同的虚拟内存空间,也就是说进程的内存空间是隔离的。另外,以不同用户运行进程,所具备的权限也是不同的, root 用户拥有管理员权限,而普通用户运行的进程则没有。
当然,普通进程的这些隔离机制同样适用于容器应用。同理,容器应用的各种隔离机制也同样适用于普通进程,容器把这些额外的隔离机制封装成了更易用的接口。
每个人都会碰到不知所措的问题,疑难杂症和灵异问题会伴随在每个技术人的成长过程中。所以不要慌,先梳理清楚问题再逐步攻破,
你可以从下面几个思路来解决这些难题:
其实,性能问题并没有你想像得那么难,只要你理解了应用程序和系统的少数几个基本原理,再进行大量的实战练习,建立起整体性能的全局观,大多数性能问题的优化就会水到渠成。