linux 巨页使用测试以及勘误1
linux使用hugetlbfs的方式来支持巨页,也成为大页。
网上看到有人说巨页不支持read,和write调用,只支持mmap,但是看3.10内核代码的时候发现:
const struct file_operations hugetlbfs_file_operations = {
.read = hugetlbfs_read,--------------------------------初始化了。
.mmap = hugetlbfs_file_mmap,
.fsync = noop_fsync,
.get_unmapped_area = hugetlb_get_unmapped_area,
.llseek = default_llseek,
};
查看vfs_read代码,要确定下是否hugetlbfs_read就是file->f_op->read
ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
{
ssize_t ret;
if (!(file->f_mode & FMODE_READ))
return -EBADF;
if (!file->f_op || (!file->f_op->read && !file->f_op->aio_read))
return -EINVAL;
if (unlikely(!access_ok(VERIFY_WRITE, buf, count)))
return -EFAULT;
ret = rw_verify_area(READ, file, pos, count);
if (ret >= 0) {
count = ret;
if (file->f_op->read)
ret = file->f_op->read(file, buf, count, pos);
使用如下测试代码分别测试:
#include <fcntl.h>
#include <sys/mman.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#define MAP_LENGTH (10*1024*1024)
#define TEST_PATH ("/mnt/huge_caq/test")
#define TEST_READ 1
#define TEST_WRITE 0
#define TEST_MMAP 1
int main()
{
int fd;
void * addr;
ssize_t ret=0;
/* create a file in hugetlb fs */
fd = open(TEST_PATH, O_CREAT | O_RDWR);
if(fd < 0){
perror("Err: ");
return -1;
}
#if 0
#if TEST_WRITE
ret = write(fd,"hello\r\n",7);
perror("Err: ");
#endif
#endif
#if TEST_READ
char buf[10];
ret = read(fd,buf,7);
printf("read ret=%d\r\n",ret);
#endif
#if TEST_MMAP
/* map the file into address space of current application process */
addr = mmap(0, MAP_LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if(addr == MAP_FAILED){
perror("Err: ");
close(fd);
unlink(TEST_PATH);
return -1;
}
/* from now on, you can store application data on huage pages via addr */
memcpy(addr,"hello\r\n",7);
#if TEST_WRITE
ret = write(fd,"hello\r\n",7);
perror("Err: ");
#endif
#if TEST_READ
memset(buf,0,10);
ret = read(fd,buf,7);
if(ret)
{
printf("read ret=%d,buf=%s\r\n",ret,buf);
}
#endif
munmap(addr, MAP_LENGTH);
#if TEST_READ
memset(buf,0,10);
ret = read(fd,buf,7);
printf("read ret=%d\r\n",ret);
#endif
#endif
close(fd);
unlink(TEST_PATH);
return 0;
}
然后gdb跟踪如下,发现是可以读的,读出来数据也是正常的。
54 memset(buf,0,10);
(gdb)
55 ret = read(fd,buf,7);
(gdb)
56 if(ret)
(gdb) p ret
$1 = 7
(gdb) p buf
$2 = "hello\r\n\000\000"
使用如下脚本确定file->f_op->read的对应函数
probe kernel.function("vfs_read").return
{
#print_backtrace();
if(($count==7)&&($file->f_op)&&($file->f_op->read))
{
printf("begin pid=%d,execname=%s,f_op=%s,read=%s,aio=%x\r\n",pid(),execname(),symname($file->f_op),symname($file->f_op->read),$file->f_op->aio_read);
}
}
begin pid=30371,execname=main.o,f_op=hugetlbfs_file_operations,read=hugetlbfs_read,aio=0,没错,就是hugetlbfs_read。
从测试结果看,是支持read的。至于从哪个内核版本支持的,没有继续研究,有兴趣的同学可以跟一下git的记录。
linux 巨页使用测试以及勘误1的更多相关文章
- linux 巨页使用测试
这里记录测试巨页的mmap使用,测试代码和<linux 巨页使用测试以及勘误1>类似. 跟踪脚本如下: probe kernel.function("hugetlb_reserv ...
- 【Debian百科】巨页
巨页 为什么使用巨页? 当一个进程使用一些内存的时候,CPU就把那部分内存标记成已被该进程使用的.为了提高效率,CPU会按4K字节块(它在很多平台上是默认值)分配内存.这些块被称作页.这些页可以被交换 ...
- Thermostat:双层存储结构的透明巨页内存管理机制
这是一篇由密歇根大学的Neha Agarwal 和 Thomas F. Wenisch,发表在计算机系统顶会ASLOS的论文,Thermostat: Application-transparent P ...
- [转贴]LTP--linux稳定性测试 linux性能测试 ltp压力测试 ---IBM 的 linux test project
https://blog.csdn.net/melody157398/article/details/24354415 LTP--linux稳定性测试 linux性能测试 ltp压力测试 ---I ...
- 对Linux系统内核版本稳定性测试介绍
对Linux系统内核版本稳定性测试介绍 在对 Linux 内核版本稳定性的测试中,需要明确地声明并证明为什么版本是稳定的或者是不稳定的. 然而还没有被证明和证实当前现有的系统范围内的压力测试可以测试 ...
- LTP--linux稳定性测试 linux性能测试 ltp压力测试 ---IBM 的 linux test project
LTP--linux稳定性测试 linux性能测试 ltp压力测试 ---IBM 的 linux test project Peter盼 2014-04-23 11:25:49 20302 收藏 ...
- LTP--linux稳定性测试 linux性能测试 ltp压力测试 内核更新 稳定性测试
LTP--linux稳定性测试 linux性能测试 ltp压力测试 zhangzj1030关注14人评论33721人阅读2011-12-09 12:07:45 说明:在写这篇文章之前,本人也不曾了 ...
- LTP--linux稳定性测试 linux性能测试 ltp压力测试 ltp-pan
LTP--linux稳定性测试 linux性能测试 ltp压力测试 zhangzj1030关注14人评论33710人阅读2011-12-09 12:07:45 说明:在写这篇文章之前,本人也不曾了 ...
- 【NO.13】Jmeter - 在Linux整理和计算测试结果
我们现在描述的是:在Linux系统使用Jmeter执行性能测试. 所以当执行完测试以后,就要计算一下测试结果,反馈给开发人员嘛. 在Linux系统使用Jmeter执行性能测试都包含哪些步骤,来,回顾一 ...
随机推荐
- IndentationError: unexpected indent
都知道python是对格式要求很严格的,写了一些python但是也没发现他严格在哪里,今天遇到了IndentationError: unexpected indent错误我才知道他是多么的严格. ...
- scrapy使用PhantomJS爬取数据
环境:python2.7+scrapy+selenium+PhantomJS 内容:测试scrapy+PhantomJS 爬去内容:涉及到js加载更多的页面 原理:配置文件打开中间件+修改proces ...
- Go从三个站点中返回响应最快的
利用协程可以轻松实现 package main import ( "fmt" "github.com/imroc/req" ) func mirroredQue ...
- JAVA处理Http请求(GET,POST)
本文用的是java.net里面的方法,HttpClient也可以. java.net.HttpURLConnection java.net.URL 1. GET public static Strin ...
- sprintf的用法
正文:printf 可能是许多程序员在开始学习C 语言时接触到的第二个函数(我猜第一个是main),说起来,自然是老朋友了,可是,你对这个老朋友了解多吗?你对它的那个孪生兄弟sprintf 了解多吗? ...
- Running Solr in Docker
Docker现在越来越火,所有的应用程序都想Docker一下,但是并没有听说在Docker上运行Solr.在没有Docker之前要想使用Solr需要在宿主机安装JDK,安装Tomcat,下载Solr程 ...
- 《JAVA程序设计与实例》记录与归纳--类与对象
类与对象 概念贴士: 1. 类必须先定义了才能使用.类是创建对象的模板,创建对象也叫类的实例化. 2. 在Java中,使用new关键字来创建对象,一般有一下3个步骤: 1)声 明:声明一个对象,包 ...
- 解决Fiddler出现无线弹框 "creation of the root certificate was not successful”的问题
打开Fiddler 访问:http://localhost:8888/ 安装证书,如果提示没有证书(8888是你在Tool->Fiddler Option->Connections设置的F ...
- api接口写好了?想过(Accept,Content-Type)?返回类型json|xml?
api接口写好了?想过(Accept,Content-Type)?返回类型json|xml? 起因: - A,B. A调用B提供的api接口. - A:为毛你的接口返回的是xml格式的(浏览器访问)? ...
- [linux] C语言Linux系统编程-TCP通信的11种状态
三次握手由client主动发出SYN请求, 此时client处于SYN_SENT状态(第一次握手)当server收到之后会由LISTEN转变为SYN_REVD状态, 并回复client, client ...