Linux 的交换空间(swap)是什么?有什么用?

swap是什么?

swap就是磁盘上的一块区域。它和Windows系统中的交换文件作用类似,但是它是一段连续的磁盘空间,并且会用户不可见。


swap有什么用?

当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上。当然从用户的角度来看就相当于内存变大了。但在内部其实是将一段物理磁盘即swap分区充当Wie内存来使用。当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,所以就有换入和换出两个过程。

  • 换出,就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。
  • 换入,则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来。

Swap 其实是把系统的可用内存变大了。即使服务器的内存不足,也可以运行大内存的应用程序。事实上,内存再大,对应用程序来说,也有不够用的时候。
系统总是在物理内存不够时,才进行Swap交换。swap大小是有上限的,一旦swap使用完,操作系统会触发OOM-Killer机制,把消耗内存最多的进程kill掉以释放内存


swap使用典型场景

我们常见的笔记本电脑的休眠和快速开机的功能,也基于 Swap 。休眠时,把系统的内存存入磁盘,这样等到再次开机时,只要从磁盘中加载内存就可以。这样就省去了很多应用程序的初始化过程,加快了开机速度。


如何查看你的系统是否用到交换空间呢?

怎么知道你的系统有没有用到交换空间呢?只需要在root用户下,运行下面的命令就可以知道了。

free -m # m 是指单位为MB,默认是KB

在日常应用中,通过上述命令看到交换空间的使用情况为0,那么你就不需要很大的虚拟内存,甚至可以完全不需要另辟硬盘空间作为虚拟内存。那么,万一有一天你需要了呢,难道要重装系统?大可不必,在Linux下虚拟内存不单可以放在单独的交换分区,也可以是一个在正常分区下的交换文件。


查看系统中swap in/out的情况

并不是swap空间占用多就一定性能下降,真正影响性能是swap in和out的频率,频率越高,对系统的性能影响越大,我们可以通过vmstat命令来查看swap in/out的频率。

vmstat(VirtualMeomoryStatistics,虚拟内存统计)是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。

例如:要以3秒为时间间隔,连续收集10次性能数据,命令如下:
在这里插入图片描述
在这里插入图片描述

### C++ 分布式网络通信框架推荐 在开发分布式系统时,选择合适的框架对于系统的性能、可扩展性和维护性至关重要。以下是几个适合 C++ 开发的分布式网络通信框架及其特点: #### 1. **Mprpc** Mprpc 是一个基于 Protobuf 的分布式 RPC 框架[^4]。它的主要特性包括: - 使用 Google Protocol Buffers 进行高效的数据序列化和反序列化。 - 支持 ZooKeeper 作为服务注册中心,便于实现服务发现。 - 基于 Muduo 网络库构建,提供了高效的异步 I/O 处理能力。 - 实现了单线程异步日志记录功能。 代码示例展示了如何通过 `SendRpcResponse` 函数将响应序列化并发送给客户端[^3]: ```cpp void RpcProvider::SendRpcResponse(const muduo::net::TcpConnectionPtr& conn, google::protobuf::Message *response) { std::string response_str; if (response->SerializeToString(&response_str)) { // 将消息对象序列化为字符串 conn->send(response_str); // 发送序列化的数据到客户端 } else { std::cout << "serialize response_str error!" << std::endl; // 如果序列化失败则打印错误信息 } conn->shutdown(); // 主动关闭连接模拟 HTTP 短链接行为 } ``` #### 2. **Thrift** Apache Thrift 是另一个广泛使用的跨语言 RPC 框架,支持多种编程语言,其中包括 C++[^2]。其核心优势在于: - 提供了一种 IDL(接口定义语言),允许开发者定义服务接口和服务端/客户端自动生成代码。 - 数据传输采用紧凑的二进制格式,相比 JSON 或 XML 更加高效。 - 能够轻松集成到现有的 C++ 工程中,并且具备良好的社区支持。 #### 3. **gRPC** 尽管 gRPC 最初是由谷歌设计并主要用于 Go 和 Java 编程语言,但它同样也支持 C++ 平台上的开发工作流。关键亮点如下: - 利用了 Protocol Buffers 作为默认的消息传递机制。 - 内置负载均衡、认证授权等功能组件。 - 对现代 C++ 特性的良好适配使得编写高性能的服务变得更加容易。 #### 4. 自定义轻量级 RPC 框架 如果现有开源解决方案无法完全满足特定业务场景的需求,则可以考虑自行研发定制版 RPC 架构。例如,在上述提到的文章里作者分享了自己的实践经历——创建名为 yyg_rpc_server 的简易版本[^1]。该项目虽然目前仍处于早期阶段但已经涵盖了基本的功能模块如同步请求处理等基础要素。 综上所述,无论是选用成熟的第三方工具还是尝试打造专属方案都需要依据实际应用场景做出权衡考量。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不怕娜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值