前期分享重点回顾
课间讨论各个语言问题:
C: 代码不够复用,内存问题,适合开发底层核心组件(框架变动较少,需要掌控资源)。
CPP:语法复杂,入门槛高,内存问题,人力问题
JAVA:GC问题,代码复杂 ,过于抽象。性能问题
GO:不支持面向对象,代码复用差,GC问题
Python:性能问题,运行时的问题(语法,多线程,GIL)
核心就是:深入理解概念和原理,大量实践去验证原理,找到问题的根因(不放过任何一个重要的问题),经常总结复盘
深度剖析大厂求职本质原理
具体举一个后台面试的常见问题,缓存的设计:面试官可以从缓存的作用,数据淘汰方式的选择这些基础问题开始发问,如果候选人能七七八八讲出来,就可以抛出“数据更新时候缓存不一致”这个问题了,大部分候选人并不知道延迟双删之类的套路,那这个问题就可以变成开放问题了,面试官可以引导候选人一步一步去推导不同数据更新的顺序会导致什么样的后果,在引导几个场景后,问题就可以平滑的变成让候选人设计一个方案,减小数据更新场景下缓存不一致导致的负面影响。这个过程就比较容易看出候选人在经过一系列分析后的思考与总结能力,也可能看出来候选人平时的一些思维方式.
社招面对的都是老手,那些职位匹配,技术栈匹配更容易获得offer,是否高薪取决于HC的紧急和重要性(高等级HC),比如有些核心部门只招10级以上工程师,这些进来薪水是需要对齐平均水平的,如果你之前薪水很低,那涨幅就非常大!
面试是一个双向选择的过程,工作不是“求”来的,求也求不来,很多时候不聘用你仅仅是因为你运气不好而已,校招不能进心意公司,可以通过社招(弯道超车)进去(可能职级和薪水会更高),一次不行,可以多试几次,没有必要杞人忧天,给自己太大的压力, 该你的总会得到的,只是时机问题。
如何学习核心基础知识-网络
推荐文章:
Reactor是基于同步IO,事件驱动机制,reactor实现了一个被动事件接收和分发的模型,同步等待事件到来,并作出响应,Reactor实现相对简单,对于耗时短的处理场景处理高效,同时接收多个服务请求,并且依次同步的处理它们的事件驱动程序
Proactor基于异步IO,异步接收和同时处理多个服务请求的事件驱动程序,处理速度快,Proactor性能更高,能够处理耗时长的并发场景
Linux内核协议栈实现框架-分层思想
1.socket layer
2.tcp/udp layer(TCP,UDP)
3.L3 IP layer(route,netfilter,arp)
4.L2 link layer(driver)
5.hardware driver layer
推荐文章:
Linux Kernel TCP/IP Stack|Linux网络硬核系列
传统Linux网络驱动的问题
中断开销突出,大量数据到来会触发频繁的中断(softirq)开销导致系统无法承受,
需要把包从内核缓冲区拷贝到用户缓冲区,带来系统调用和数据包复制的开销,
对于很多网络功能节点来说,TCP/IP协议并非是数据转发环节所必需的,
NAPI/Netmap等虽然减少了内核到用户空间的数据拷贝,但操作系统调度带来的cache替换也会对性能产生负面影响。
改善iptables/netfilter的规模瓶颈,提高Linux内核协议栈IO性能,内核需要提供新解决方案,那就是eBPF/XDP框架
BPF 是 Linux内核中高度灵活和高效的类似虚拟机的技术,允许以安全的方式在各个挂钩点执行字节码。它用于许多Linux内核子系统,最突出的是网络、跟踪和安全(例如沙箱)。
XDP的全称是:eXpress DataPath,XDP 是Linux内核中提供高性能、可编程的网络数据包处理框架。
• 直接接管网卡的RX数据包(类似DPDK用户态驱动)处理
• 通过运行BPF指令快速处理报文;
• 和Linux协议栈无缝对接;
推荐文章:
在Kubernetes中要保证容器之间网络互通,网络至关重要。而Kubernetes本身并没有自己实现容器网络,而是通过插件化的方式自由接入进来。在容器网络接入进来需要满足如下基本原则:
Pod无论运行在任何节点都可以互相直接通信,而不需要借助NAT地址转换实现。
Node与Pod可以互相通信,在不限制的前提下,Pod可以访问任意网络。
Pod拥有独立的网络栈,Pod看到自己的地址和外部看见的地址应该是一样的,并且同个Pod内所有的容器共享同个网络栈。
目前流行插件:Flannel、Calico、Weave、Contiv
lOverlay模式:Flannel(UDP、vxlan)、Weave、Calico(IPIP)
三层路由模式:Flannel(host-gw)、Calico(BGP)
Underlay网络:Calico(BGP)
当前容器网络依赖Linux 底层技术
网络命名空间(NetworkNamespace),Veth Pair
网桥bridge和路由子系统
Iptables/Netfilter
ebpf和 XDP
网络虚拟化 (NV) 是指将传统上在硬件中交付的网络资源抽象化到软件中。NV 可以将多个物理网络整合为一个基于软件的虚拟网络,或者可以将一个物理网络划分为多个隔离和独立的虚拟网络。
在传统网络环境中,一台物理主机包含一个或多个网卡(NIC),要实现与其他物理主机之间的通信,需要通过自身的NIC连接到外部的网络设施,如交换机上。
这种架构下,为了对应用进行隔离,往往是将一个应用部署在一台物理设备上,这样会存在两个问题,
1)是某些应用大部分情况可能处于空闲状态,
2)是当应用增多的时候,只能通过增加物理设备来解决扩展性问题。不管怎么样,这种架构都会对物理资源造成极大的浪费。
虚拟机与虚拟机之间的通信,由虚拟交换机完成,虚拟网卡和虚拟交换机之间的链路也是虚拟的链路,整个主机内部构成了一个虚拟的网络,如果虚拟机之间涉及到三层的网络包转发,则又由另外一个角色——虚拟路由器来完成。
虚拟网络核心技术:
• 虚拟路由器-vswitch(宿主机虚拟网络封包转发程序: 内核netfilter,DPDK,FPGA等)
• 高性能网关-GW(NAT,EIP-GW,LB等)
• APP性能优化:空间局部性和时间局部性
• 协议栈调优:numa亲和,中断亲和,软中断亲和,软中断队列大小,邻居表大小,连接跟踪表大小,TCP队列调整,协议栈内存分配,拥塞控制算法优化
• Bypass内核协议栈:DPDK,RDMA.
• 网卡优化:驱动配置,offload,网卡队列,智能网卡,高性能网卡。
• 硬件加速器:ASIC、FPGA,网络处理器,多核处理器
推荐文章:
拥塞控制的意义:
解决对共享链路的带宽分配问题
保持网络通畅
小流无阻塞地通过网络(FCT=RTT)
实现高效带宽利用
维护流之间的公平性
采集信息:
• 丢包
• 队列高度
• RTT
• INT信息(In-bandNetwork Telemetry,带内网络遥测技术)
传统Linux网络驱动的问题
中断开销突出,大量数据到来会触发频繁的中断(softirq)开销导致系统无法承受
需要把包从内核缓冲区拷贝到用户缓冲区,带来系统调用和数据包复制的开销
对于很多网络功能节点来说,TCP/IP协议并非是数据转发环节所必需的
NAPI/Netmap等虽然减少了内核到用户空间的数据拷贝,但操作系统调度带来的cache替换也会对性能产生负面影响
1 DPDK无中断方式直接操作网卡的接收和发送队列2 软中断必须内核处理,DPDK UIO很薄,专门处理软中断(链路状态通知仍必须采用中断方式)。
DPDK网络优化
•PMD用户态驱动•CPU亲缘性和独占•内存大页和降低内存访问开销•避免False Sharing•内存对齐•cache对齐•NUMA•减少进程上下文切换•分组预测机制•利用流水线并发•为了利用空间局部性•充分挖掘网卡的潜能
https://tonydeng.github.io/sdn-handbook/dpdk/introduction.html
RDMA 作为一种旁路内核的远程内存直接访问技术,被广泛应用于数据密集型和计算密集型场景中,是高性能计算、机器学习、数据中心、海量存储等领域的重要解决方案。
RDMA 具有零拷贝、协议栈卸载的特点。RDMA 将协议栈的实现下沉至RDMA网卡(RNIC),绕过内核直接访问远程内存中的数据
RDMA 与传统 TCP/IP实现相比不仅节省了协议处理和数据拷贝所需的CPU资源,同时也提高了网络吞吐量、降低了网络通信时延
ASIC的特点是:面向特定用户的需求,ASIC在批量生产时与通用集成电路相比具有体积更小、功耗更低、可靠性提高、性能提高、保密性增强、成本降低等优点。
FPGA的特点:加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此FPGA能够反复使用。理论上,FPGA允许无限次的编程。
ASIC需要较长的开发周期,风险较大
从设计成本来考虑,小批量上FPGA占优,大批量时,ASIC占优
相同的工艺和设计,在FPGA上的速度应该比ASIC跑得慢。因为FPGA内部是基于通用的结构,也就是LUT(lookup table),它可以实现加法器,组合逻辑等等,而ASIC,一般加法器就是加法器,而比较器就是比较器,FPGA结构上的通用性必然导致冗余
总的来说,就如同GPU和CPU一样。GPU可以非常快的处理图像,但是让GPU去处理其他的东西,GPU表示摊手。CPU很多的运算都能处理,也能去处理图像,只是慢而已。一旦你是冲着某个目的去的(ASIC)你为了实现这个目标,你各种没节操没下线都可以。如果你想要多方面兼顾(FPGA),你就不可能在每一个方面都做到最好,你必须trade-off。
Nitro项目将焦点放在这三成的虚拟化损耗上,通过定制化的硬件,将这些虚拟化损耗挪到定制的Nitro系统上,让服务器上的资源基本上都能够提供给用户。
阿里神龙架构把VPC网络虚拟化 offload到FPGA硬件。
核心思想:从下到上分层分析各层可能产生丢包场景,先查看关键信息,然后再分析确认;
了解收发包的原理,可以了解到丢包原因主要会涉及网卡设备、网卡驱动、内核协议栈,APP socket程序等。从下到上分层分析(各层可能性出现的丢包场景),然后查看关键信息(学会使用各种网络排障工具),最终定位出网络问题的原因。
本地服务器排查
> 硬件网卡丢包
> 网卡驱动丢包
> 以太网链路层丢包
> 网络IP层丢包
> 传输层UDP/TCP丢包
> 应用层socket丢包
推荐文章:
技术前沿:智能故障定位系统,比如阿里的vtrace和齐天平台。
文章:https://developer.aliyun.com/article/764841?spm=a2c6h.12873639.0.0.6117671ctzqYdB
论文:https://dl.acm.org/doi/abs/10.1145/3387514.3405851
阿里齐天平台:https://developer.aliyun.com/article/727656
分享就像一把梯子,给愿意往上爬的人一些帮助。
PPT和录制的视频已经上传到星球上了。这次5个多小时的分享,在场的同学都说已经可以回本了。
极客星球希望成为最有技术含量星球,决定做这个,我是非常认真的,尽最大努力提供技术和成长帮助!我愿把我毕生所学的知识和多年职场实战经验分享给大家, 帮你解决技术成长中困惑和迷茫,扫清无用的障碍,助你快速成长,物有所值!
目前还有一些优惠劵,欢迎大家加入极客星球,相互学习,共同进步!
五个多小时的分享,值得一个三连(一朵小红花)吗
- END -
看完一键三连在看,转发,点赞
是对文章最大的赞赏,极客重生感谢你
推荐阅读
求点赞,在看,分享三连