首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

性能优化之写时复制(Copy-on-write:COW)

写入时复制(英语:Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的(transparently)。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。

01

零拷贝(zero copy)技术你真的懂吗?什么时候需要用到内存映射?

Linux系统是虚拟内存系统,虚拟内存并不是真正的物理内存,而是虚拟的连续内存地址空间。虚拟内存又分为内核空间和用户空间,内核空间是内核程序运行的地方,用户空间是用户进程代码运行的地方,只有内核才能直接访问物理内存并为用户空间映射物理内存(MMU)。内核会为每个进程分配独立的连续的虚拟内存空间,并且在需要的时候映射物理内存,为了完成内存映射,内核为每个进程都维护了一张页表,记录虚拟地址与物理地址的映射关系,这个页表就是存在于MMU中;用户进程访问内存的时候,通过页表把虚拟内存地址转换为物理内存地址进而访问数据;其实对于用户进程而言,虚拟内存就是内存一般的存在(当作内存看待就好)。这样的设计可以把用户程序和系统程序分开,互不影响;内核可以对所有的用户程序进行管理,比如限制内存滥用等

01

规划Redis真的需要预留一半内存?

前段时间,由于太多的因素造成redis故障, 负面影响较大。复盘后决定将内存超出内存一半就需要告警,便于运维人员及时介入处理。 网上这种redis规划内存预留一半的文章汗牛充栋(https://cloud.tencent.com/developer/article/1095192)。真实的情况下,真的需要预留下一半的内存吗? 搞清楚这个问题,需要弄清楚2个事情: 1. Redis bgsave/AOF重写的运行机制。 2. Linux下的进程内存分布以及redis内存管理机制。 先说问题1: 1.redis跟内存相关的运行机制莫过于rdb持久化/AOF重写/内存剔除策略(高版本redis还存在着内存碎片整理的配置选项), 其中AOF重写和rdb持久化都属于fork子进程来完成的。本次就以rdb持久化为例,rdb的持久化可以由持久化的配置策略或者命令行bgsave或者主从全同步触发。redis在做bgsave的时候,fork出子进程来做bgsave。具体的过程如下: rdbSaveBackground()中fork子进程 ---> rdbSave() ---> rdbSaveRio()。fork后子进程拥有和父进程一模一样的进程空间,虽然采用了COW机制(父子进程的虚拟内存指向相同的物理page),但是ps或者top命令中的RSS显示的值都会算成自己进程所占的物理内存,这个可能是很多运维同学/DBA同学经常可以眼见的现象,恐怕这个就是潜意识里需要内存预留一半的重要因素。

03

嵌入式Linux系列第3篇:uboot编译下载

本篇介绍如何编译及下载uboot到ARM板子上。对于初学者有这么三个名词,分别是uboot、kernel和rootfs。这三个名词我刚开始接触是非常的困惑,现在随着使用增多稍微有一点点感觉。大家刚开始学不用太纠结这个问题,等实际操作一段时间就会理解了。uboot的主要作用是用来启动linux内核,因为CPU不能直接从块设备(如NAND/EMMC/SD卡)中执行代码,需要把块设备中的程序复制到内存中,而复制之前还需要进行很多初始化工作,如时钟、串口等;要想让CPU启动linux内核,只能通过另外的程序,进行必要的初始化工作,再把linux内核中代码复制到内存中,并执行这块内存中的代码,即可启动linux内核;一般情况下,我们把linux镜像储存在块设备中如SD卡、Nandflash等块设备中,首先执行uboot代码,在uboot中把块设备中的内核代码复制到某内存地址处,然后再执行这个地址,即可启动内核。

06
领券