转自 https://www.a5idc.net/helpview_815.html
如果您发现Linux系统的性能不能达到标准,请启用zRAM以获得更高效的swap系统。
swap的问题在于它通常驻留在比系统上安装的RAM慢的驱动器上。当然,在Linux上总是有解决办法的。这个方法就是zRAM模块,这样做的目的是将RAM的一部分用作swap空间。swap的目的不就是为了解决内存不足的问题吗?
存储在zRAM分区中的数据被压缩,因此更多的数据可以存储在RAM中。虽然CPU时间的一小部分用于这种压缩,但是性能上的权衡通常是值得的。
如果这听起来像您要使用的模块,您将如何使用它呢?
1、由于在所有Linux发行版中都可以使用zRAM,因此您唯一需要做的是:运行中的Linux系统服务器、具有sudo特权的用户。
这里将在Ubuntu Server 18.04上进行演示。如果您使用其他发行版,则只需修改systemd单位文件以适合您选择的发行版。
2、如何启用zRAM
zRAM模块由systemd控制,因此不需要fstab条目。由于所有的东西都已经安装好了,我们只需要创建几个文件并修改一个即可。
打开一个终端窗口,并使用以下命令创建一个新文件:
sudo nano /etc/modules-load.d/zram.conf
在该文件中,添加单词:
zram
保存并关闭文件。
接下来,使用命令创建另一个新文件:
sudo nano /etc/modprobe.d/zram.conf
在该文件中,粘贴以下行:
options zram num_devices=1
保存并关闭文件。
接下来,我们需要配置zRAM分区的大小。使用以下命令创建一个新文件:
sudo nano /etc/udev/rules.d/99-zram.rules
在该文件中,粘贴以下内容(修改disksize属性以适合您的需要):
KERNEL=="zram0", ATTR{disksize}="512M",TAG+="systemd"
保存并关闭文件。
3、如何禁用传统swap
为了使zRAM正常运行,您将需要禁用传统的swap。这在fstab文件中处理。使用以下命令打开该文件:
sudo nano /etc/fstab
在该文件中,注释掉/swap.img开头的行(添加#号)。
保存并关闭文件。
4、如何创建一个systemd单位文件
为了运行zRAM,我们需要创建一个systemd单位文件。使用以下命令创建此文件:
sudo nano /etc/systemd/system/zram.service
在该文件中,粘贴以下内容:
[Unit]
Description=Swap with zram
After=multi-user.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStartPre=/sbin/mkswap /dev/zram0
ExecStart=/sbin/swapon /dev/zram0
ExecStop=/sbin/swapoff /dev/zram0
[Install]
WantedBy=multi-user.target
保存并关闭文件。
使用以下命令启用新设备:
sudo systemctl enable zram
重新启动机器。
5、如何确定zRAM是否正常工作
系统重启后,重新登录。在终端窗口中,发出以下命令:
cat /proc/swaps
现在,您应该看到/ dev / zram0正在处理您的swap。
恭喜你,zRAM现在可以工作了。当应用程序或服务开始在系统上使用swap时,您应该会看到性能的提升。
不会。_ram(也称为 zRAM,先前称为 compcache)是 Linux 内核的一项功能,可提供虚拟内存压缩。zram 通过在 RAM 内的压缩块设备上分页,直到必须使用硬盘上的交换空间,以避免在磁盘上进行分页,从而提高性能。由于 zram 可以用内存替代硬盘为系统提供交换空间的功能,zram 可以在需要交换 / 分页时让 Linux 更好利用 RAM ,在物理内存较少的旧电脑上尤其如此。
1,同目录下的makefile,如#
# Makefile for industrial I/O Magnetometer sensors
#
obj-$(CONFIG_SENSORS_AK8975)+= ak8975.o
obj-$(CONFIG_SENSORS_HMC5843)+= hmc5843.o
2,同目录下的kconfig
#
# Magnetometer sensors
#
comment "Magnetometer sensors"
config SENSORS_AK8975
tristate "Asahi Kasei AK8975 3-Axis Magnetometer"
depends on I2C
help
Say yes here to build support for Asahi Kasei AK8975 3-Axis
Magnetometer.
To compile this driver as a module, choose M here: the module
will be called ak8975.
3,总的config(配置变量为Y)
各项目配置文件的位置不同,
coffee:kernel/arch/arm/configs/M7023Q-debug-perf_defconfig
juice:common/customer/configs
配置信息如下:
# CONFIG_CFG80211 is not set
CONFIG_EXPERIMENTAL=y
CONFIG_LOCALVERSION="$(KERNEL_LOCAL_VERSION)-perf"
CONFIG_SWAP=y
CONFIG_ZRAM=m
CONFIG_SYSVIPC=y
CONFIG_SENSORS_AK8975=y
......
查看变量是否在编译时配置成功:
out/target/product/m7023q/obj/KERNEL_OBJ/include/generated/Autoconf.h
查找CONFIG_SENSORS_AK8975
若在编译时有配置成功,将找到这一行:
#define CONFIG_SENSORS_AK8975 1
4、修改板级文件:
4.0及后续项目统一在:kernel/arch/arm/mach-msm/board-qrd7627a.c
注意juice中,很多配置(如tp)写在kernel/arch/arm/mach-msm/board-msm7627a-io.c
在代码中增加新模块的内容,应该有两处,第一处设置函数和结构体,第二处实际调用,注意引用上述第3步新增的编译开关将代码限制起来。
这些内容大多可以拷贝其它模块,但是名字要和driver中的相同,注意要改的地方除了名字之外,还有中断脚和I2C脚。其中固定模块的中断脚大部分时候不会改变(如tp就是int:48,reset:26),除非板子的datasheet特别注明才需要改变。但是I2C脚是会随着slaver device的改变而改变的,需要查清楚。
配置platform_data:
一般需要初始化一个xxx_platform_data结构体(这个结构体的声明应该让驱动文件可视,probe中才知道去读某个platformdata.yyy),并在i2c_board_info结构体中用.platform_data指向它,然后这个i2c_board_info将在板级文件中被注册(作为函数i2c_register_board_info()的参数)。而这个.platform_data很有可能在驱动的probe函数中调用到,例如:
static struct msg2133_ts_platform_data msg2133_platformdata= {
.irq = 0,
.reset = GPIO_TP_RESET,
}
static struct i2c_board_info i2c_info_msg2133_dpt = {
I2C_BOARD_INFO("msg2133", 0x27),
.platform_data = &msg2133_platformdata,
}
i2c_info_msg2133_dpt.platform_data->irq = gpio_to_irq(GPIO_TP_INT)//结构体初始化的时候只能以常量赋值,因为此处需要做GPIO到irq的映射,所以要在此处赋值。
i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, &i2c_info_msg2133_dpt, 1)
在驱动的probe中:pdata =client->dev.platform_data
...... = pdata.yyy......//(msg2133_ts_platform_data在该文件中可见)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)