## 内存子系统优化:摘要 这系列博客包含18篇文章,专注于通过高效利用内存子系统来优化软件性能——这对于处理大型数据集的应用至关重要,即使对于较小的应用也有益处。 主要涵盖的领域包括**减少内存访问**(通过寄存器使用和编译器技术)、通过访问模式和布局更改(类、数据结构)**提高数据局部性**,以及为了提高速度**减小数据集大小**。该系列还深入探讨了通过**自定义内存分配器**和**提高指令级并行性**进行的运行时优化。 进一步的主题包括使用预取**隐藏内存延迟**、**最小化TLB缓存缺失**以及**节省内存带宽**以实现“良好邻居”编程。 此外,还讨论了**多线程应用程序**和**低延迟系统**的专门考虑因素,以及**测量内存子系统性能**和**分支预测与内存访问**之间的关系。 这篇博客提供了实用的技术,通过理解和利用内存层次结构的复杂性来提高软件的速度和效率。
## HNSW:快速向量搜索解释
传统的向量搜索使用余弦相似度将查询与数据集中的每个项目进行比较——这是一个缓慢的过程(线性搜索,O(N))。分层可导航小世界(HNSW)极大地加快了速度,即使对于大型数据集也能实现近乎即时的结果。
HNSW 模仿我们导航城市的方式:从广阔的概述(高速公路)开始,并逐步放大(州道、主干道、支路)以精确定位位置。它构建分层数据结构,其中较高层具有较少的连接(快速遍历),而较低层具有更多的连接(详细搜索)。
搜索过程从顶层开始,快速缩小可能性范围,然后向下遍历各层,细化搜索,直到到达底层。一个名为 `$ef` 的参数控制精度——较高的值意味着评估更多的节点,以获得更准确但更慢的搜索。另一个关键参数 `$M` 定义了每个节点的最大连接数,影响内存使用。
HNSW 在数据插入期间动态地构建这个“地图”,使用概率方法将点分配到层并将其连接到相似的邻居,从而确保效率。
最终,HNSW 将搜索复杂度从 O(N) 转换为 O(log N),使其成为现代向量数据库和推荐系统、RAG 等应用的基础。
## 家庭互联网与服务访问的变迁
家庭互联网已经从一个简单、直接可寻址的连接发展成为一个由经济现实驱动的分层系统。IPv4地址的耗尽导致了运营商级NAT(CGNAT)的广泛采用,在这种模式下,ISP会在许多用户之间共享公共IP地址。虽然IPv6提供了一种解决方案,但许多网络目前同时使用两者。
CGNAT可以为ISP节省资金,但会阻止直接入站连接,从而使自托管、游戏和VoIP变得复杂。带宽不仅仅是“速度”;容量、对称性(上传/下载速度相等)和可靠性(服务级别协议)至关重要——尤其是对于企业而言。中断并不总是攻击;受欢迎程度的激增或配置错误的系统可能会模仿DDoS攻击。
如果CGNAT阻止访问,**隧道**提供了一种解决方法。像**bore-cli**这样的工具会创建到公开可访问服务器的出站连接,而**Cloudflare Tunnel**则在Cloudflare边缘提供一个安全的、HTTPS终止的连接。
**关键要点:**
* CGNAT在住宅用户中很常见,限制了入站连接。
* 容量和对称性比宣传的速度更重要。
* 隧道提供了一种绕过CGNAT的解决方案,但务必遵守ISP的服务条款。
* 优先考虑安全性:使用强身份验证,保持软件更新,并备份您的数据。