前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >虚拟化与云计算硬核技术内幕(31) —— 鹿晗和吴亦凡被棒打CP散的秘密

虚拟化与云计算硬核技术内幕(31) —— 鹿晗和吴亦凡被棒打CP散的秘密

作者头像
用户8289326
发布于 2022-09-08 09:01:26
发布于 2022-09-08 09:01:26
51900
代码可运行
举报
运行总次数:0
代码可运行

上回说到,小E发现了为什么鹿晗和吴亦凡谈恋爱还没有导致新某某博服务器挂掉的秘密(划掉,文末再讲)Linux下的三个秘密,可以让同一台Linux服务器上,混部不同业务的服务进程,并且避免发生网络Socket端口,CPU与RAM资源,以及其他资源权限的三大冲突。

第一个秘密是namespace。

namespace从字面上可以翻译为“命名空间”。顾名思义地,namespace是用来从name层面,把整个系统划分为不同的space的。如果两个进程在不同的namespace,它们是相互感知不到对方的存在的,也不能通过操作系统内置的IPC等方式通信。

让我们举一个栗子。

如果鹿晗和吴亦凡(两个进程)上初二的时候就出现了早恋的倾向,在课堂上当众手拉手(出现了不应当有的进程间通信),被校长知道了,会把两个人分到不同的班(使用namespace隔离),这样,鹿晗所在的班上没有名叫吴亦凡的学生(namespace隔离下,进程找不到对方的pid),两个人就无法在课堂上手拉手了(namespace隔离禁止了进程间的通信)。

当然,在Linux下,namespace不只可以用来隔离进程。

我们在Linux源代码中的nsproxy.h 里面可以看到这么一段:

(链接:

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/linux/nsproxy.h?h=v5.16.5 )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct mnt_namespace;
struct uts_namespace;
struct ipc_namespace;
struct pid_namespace;
struct cgroup_namespace;
struct fs_struct;


/*
 * A structure to contain pointers to all per-process
 * namespaces - fs (mount), uts, network, sysvipc, etc.
 *
 * The pid namespace is an exception -- it's accessed using
 * task_active_pid_ns.  The pid namespace here is the
 * namespace that children will use.
 *
 * 'count' is the number of tasks holding a reference.
 * The count for each namespace, then, will be the number
 * of nsproxies pointing to it, not the number of tasks.
 *
 * The nsproxy is shared by tasks which share all namespaces.
 * As soon as a single namespace is cloned or unshared, the
 * nsproxy is copied.
 */
struct nsproxy {
  atomic_t count;
  struct uts_namespace *uts_ns;
  struct ipc_namespace *ipc_ns;
  struct mnt_namespace *mnt_ns;
  struct pid_namespace *pid_ns_for_children;
  struct net        *net_ns;
  struct time_namespace *time_ns;
  struct time_namespace *time_ns_for_children;
  struct cgroup_namespace *cgroup_ns;
};
extern struct nsproxy init_nsproxy;

如上面的代码中所示,namespace实际上有六种:

  1. uts_namespace, 隔离的是UNIX Time-sharing System,虽然名字上写的是time-sharing,但实际上是用于隔离主机名和域名,为一台linux服务器虚拟出不同的主机名和域名;
  2. user_namespace, 可以用于隔离用户ID,用户组ID,不同root的目录以及key等;
  3. ipc_namespace, 顾名思义是用来隔离操作系统signal、共享内存或其他IPC消息的;
  4. mnt_namespace, 用来隔离文件系统挂载点,也就是实现对文件系统做隔离;
  5. pid_namespace,隔离pid,也就是隔离不同进程;
  6. net_namespace,隔离网络。关于network namespace,我们在前面其实已经介绍过,见这里:《云计算与虚拟化硬核技术内幕 (14) —— 不忘初心,删繁就简》

通过这六种namespace,就可以实现各个进程之间的隔离,其安全程度实质上和虚拟机之间的隔离是等价的:

内存隔离:KVM隔离和namespace隔离实质上都是进程隔离(每个VM是QEMU的一个进程),操作系统从CPU的MMU硬件层面保证了被隔离的实例之间无法互访对方内存;

网络隔离:KVM隔离的虚拟机网络和namespace隔离的Linux网络,实质上都是通过Linux的network namespace实现的;

存储隔离:KVM隔离的虚拟机通过QEMU的VirtIO挂载不同的虚拟盘实现存储隔离,其安全性和mnt namespace基本同等;

这样,就解决了同一Linux服务器上混部多个服务进程实例可能造成的冲突问题;

第二个秘密是CGroups。

CGroups是Control Groups的简称,能够精确控制某一进程占用的CPU和RAM资源数量。比如,在某一配置了32vCPU(HT),128GB RAM的Linux服务器上混部了一个Web服务,一个JVM和一个数据库服务,操作系统就可以通过CGroup将CPU和RAM资源精确地分配给这三个不同的任务。

CGroups有一系列子系统,如cpu,memory,blkio,ns等,能够限制Linux操作系统中的进程使用的CPU、内存、块存储IO和系统namespace资源。

我们在前文《虚拟化与云计算技术硬核内幕 (20) —— 时间管理大师(下)》中提到过,操作系统可以为虚拟机分配vCPU和RAM,如QEMU中的一个线程,就是对应VM中的一个vCPU,将该线程单独绑定在某个硬件HT上,也就是将物理HT分配给了VM。如果将两个或多个QEMU线程绑定在一个硬件HT上,就是所谓的超分配(overscription)。

这种超分配,在CGroups中的实现则不同。如果需要把2个进程混部在同一个vCPU上,可以通过修改进程的CGropus限制,来实现限制进程在某个vCPU上,并限制其占用CPU的配额。由于Linux的时间片分配单位为0.001s (1ms),因此,CPU配额最小分配的颗粒度也不能低于1ms。

第三个秘密叫做unionfs。——这个留到下期再讲。我们先聊一下段子:

上期说到,

有一天,歌手陈某某(就是被石景山区群众举报溜冰的那个家伙),发了一条长某博,内容是自己离婚了。很快,新某某博的服务器就挂掉了。

运维团队紧急排查,发现原来是评论过多,而每条长某博及评论都放在redis里面,通过这条长某博的id,进行哈希后送去对应的redis分片。这样,如果某条长某博评论量过大,redis被过多的写请求打死,相应的APP就只能返回http 503了。

从此以后,新某某博的长某博都被改成了图片方式发布,这样可以放到对象存储里面,并通过CDN帮忙挡刀,redis的根据评论的时间戳进行分片。

这么做以后,新某某博就拍着胸脯说:即使有5个明星同时出轨或者离婚,我们也可以顶住!

后来,设计这个架构的大哥L,成为了方老师的同事,大家如果想成为L团队的一员,可以在下期关注方老师在公众号推送的招聘JD!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帅云霓的技术小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
如何编码事务
我说的事务指的是一般的数据库事务,而不是什么分布式事务之类高大上的概念。听起来很简单,但是即便如此,想实现的优雅一点也不是一件容易的事情。 
LA0WAN9
2021/12/14
3160
如何编码事务
为什么 Laravel 会成为最成功的 PHP 框架?
Laravel是一个有着美好前景的年轻框架,它的社区充满着活力,相关的文档和教程完整而清晰,并为快速、安全地开发现代应用程序提供了必要的功能。在近几年对PHP框架流行度的统计中,Laravel始终遥遥领先。那么是什么让Laravel成为最成功的PHP框架? 2011年,Taylor Otwell将Laravel作为一种包含全新现代方法的框架介绍给大家。Laravel最初的设计是为了面向MVC架构的,它可以满足如事件处理、用户身份验证等各种需求。另外它还有一个由管理数据库强力支持,用于管理模块化和可扩展性代码
wangxl
2018/03/08
4K0
Love beautiful code? We do too.
Laravel是一个有着美好前景的年轻框架,它的社区充满着活力,同时提供了完整而清晰的文档,而且为快速、安全地开发现代应用提供了必要的功能。
竹清
2018/08/31
3.2K0
Love beautiful code? We do too.
Laravel API教程:如何构建和测试RESTful API
本文原文:Laravel API Tutorial: How to Build and Test a RESTful API
WindCoder
2018/09/20
20.8K0
Laravel API教程:如何构建和测试RESTful API
Lumen event 与 PHP7 扩展 event 出现冲突
lumen event 与 php7 扩展 event 冲突 系统报错日志 [2020-03-17 15:27:37] lumen.ERROR: ErrorException: Cannot declare class Event, because the name is already in use in /home/web/vendor/laravel/lumen-framework/src/Application.php:653 Stack trace: #0 [internal function]:
美团骑手
2021/12/24
5760
使用强大的DBPack处理分布式事务(PHP使用教程)
早期的基于XA协议的二阶段提交方案,将分布式事务的处理放在数据库驱动层,实现了对业务的无侵入,但是对数据的锁定时间很长,性能较低。
用户2627641
2022/07/04
5350
采用单例模式编写PHP的PDO类
下面的代码是用此前一个名为MyPDO的类改写的,引入了单例模式来保证在全局调用中不会重复实例化这个类,降低系统资源的浪费。
魏杰
2022/12/23
4640
laravel邮箱认证
在app/User.php 引入 MustVerifyEmailTrait 即可完成邮箱验证
章鱼喵
2019/03/29
1.7K0
laravel邮箱认证
基于 Redis 消息队列实现 Laravel 事件监听及底层源码探究
在 Laravel 中,除了使用 dispatch 辅助函数通过 Illuminate\Bus\Dispatcher 显式推送队列任务外,还可以通过事件监听的方式隐式进行队列任务推送,在这个场景下,事件监听器实际上扮演了「任务类」的角色。
学院君
2021/01/08
3.6K0
08.Django基础六之ORM中的锁和事务
    select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节。
changxin7
2019/09/29
2.2K0
PHP中常用的设计模式
应用场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体的代码。
南山竹
2024/06/26
1120
PHP中常用的设计模式
Yii2工作中的一些方法技巧
假设我们当前页面的访问地址是:http://localhost/public/index...
botkenni
2019/09/02
3.3K0
Joomla 3.4.6 RCE复现及分析
前几天看了下PHP 反序列化字符逃逸学习,有大佬简化了一下joomla3.4.6rce的代码,今天来自己分析学习一下。
Ms08067安全实验室
2020/06/06
3.4K0
Laravel底层学习笔记04 加载并启动ServiceProvider,事件(观察者模式)
加载并启动ServiceProvider 源码 public/index.php $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); //1. Illuminate\Contracts\Http\Kernel::class 是别名 //2. $kernel是App\Http\Kernel的实例化对象 //3. App\Http\Kernel::class继承src/Illuminate/Foundation/Http/Kernel v
用户7353560
2021/11/07
6240
koa源码阅读[0]
Node.js也是写了两三年的时间了,刚开始学习Node的时候,hello world就是创建一个HttpServer,后来在工作中也是经历过Express、Koa1.x、Koa2.x以及最近还在研究的结合着TypeScript的routing-controllers(驱动依然是Express与Koa)。 用的比较多的还是Koa版本,也是对它的洋葱模型比较感兴趣,所以最近抽出时间来阅读其源码,正好近期可能会对一个Express项目进行重构,将其重构为koa2.x版本的,所以,阅读其源码对于重构也是一种有效的帮助。
贾顺名
2019/12/09
7030
koa源码阅读[0]
基于PHP的PDO编写的MySQL类2.0版源码分享
这次修改主要是增加了2个新function: 1. getTableEngine(),用于获取表引擎; 2. Replace(),以覆盖方式插入数据。
魏杰
2022/12/23
5940
php 设计模式-数据映射模式(应用程序与数据库交互模式)
一般,client是业务逻辑层,UserMapper是数据访问层。UserTable底层数据结构。 我们尽量做到如果表User修改了: 1)工具重新自动生成UserTable类 2)只修改client代码和少量的UserMapper代码,一般修改UserMapper的常量const的内容就可以了。
黄规速
2022/04/14
5330
Laravel5.3之Middleware源码解析
说明:本文主要学习Laravel的Middleware的源码设计思想,并将学习心得分享出来,希望对别人有所帮助。Laravel5.3之Decorator Pattern已经聊过Laravel使用了Decorator Pattern来设计Middleware,看Laravel源码发现其巧妙用了Closure和PHP的一些数组函数来设计Middleware。
botkenni
2022/01/10
2.3K0
Laravel源码解析之中间件
中间件(Middleware)在Laravel中起着过滤进入应用的HTTP请求对象(Request)和完善离开应用的HTTP响应对象(Reponse)的作用, 而且可以通过应用多个中间件来层层过滤请求、逐步完善响应。这样就做到了程序的解耦,如果没有中间件那么我们必须在控制器中来完成这些步骤,这无疑会造成控制器的臃肿。
KevinYan
2019/10/13
1.5K0
thikphp 控制器
控制器定义 类名和文件名一样, 渲染输出 渲染输出使用return输出 <?php namespace app\admin\controller; use app\admin\model\User;
mySoul
2019/05/30
6490
相关推荐
如何编码事务
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档