2017-09-11 20:45:37 qq_21792169 阅读数 6919
• 网络工程师信道数据传输速率与码元速率强化训练教程

网络工程师考试考察知识点繁多，形式多样。如何有效把握每种考察形式，拿到相应分数？这是历年考生挠头的事情。本系列课程紧抓考生痛点，对网工考试中重点题型分门别类讲解,反复强化训练，助力考生查缺补漏，拿到相应分数。本次分课程重点讲解了信道数据传输速率与码元速率的计算方法。通过基本概念阐述->历年真题强化训练->独家解题技巧总结，三大步骤帮助考生掌握信道数据传输速率与码元速率的计算方法，拿到相应分数。

2955 人正在学习 去看看 徐朋

test_ssd.c

#define _GNU_SOURCE
#include<stdio.h>
#include <time.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
//#include <unistd.h>   /* add r/w include is error */

void print_usage(char *file)
{
printf("Usage:\n");
printf("%s   <filename>  <cnt>  <ONCE_SIZE>  <r/w>\n", file);
}

int main(int argc, char **argv)
{
time_t Time_Start,Time_End;

double run_time = 0;

char* realbuff = NULL;

int fd,i,cnt,block_size,szie;
int pagesize,error,flags;

if( argc!=5)
{
print_usage(argv[0]);
return(-1);
}

if('r' == argv[4][0])
{
flags = 0;
}
else if('w' == argv[4][0]){
printf("running write operations....\n");
flags = 1;
}
else{
printf("r/w error\n");
return -1;
}

fd  = open(argv[1], O_CREAT | O_RDWR| O_DIRECT);
if(fd <0){
printf("open is fail\n");
return-1;
}

pagesize=getpagesize();
cnt = strtoul (argv[2], NULL, 0);
szie = strtoul (argv[3], NULL, 0);
block_size = (1024*1024*szie);
realbuff = malloc(block_size+pagesize);
if(realbuff ==NULL){
printf("malloc realbuff is fail\n");
return -1;
}
char *alignedbuff = (char*)((((unsigned int ) realbuff+pagesize-1)/pagesize)*pagesize);
memset(alignedbuff,argv[1][1],block_size);

if(1 == flags){
Time_Start = clock();
for(i=0;i<cnt;i++){
error = write(fd, alignedbuff, block_size);
if(error <=0)
{
perror("error:");
printf("write is fail\n");
free(realbuff);
return -1;
}
}
//printf("%d %s %s\n",__LINE__,__FUNCTION__,__FILE__);

Time_End = clock();
run_time = (double)(Time_End-Time_Start)/CLOCKS_PER_SEC;
printf( "write %d M cost times:%f s\n",(szie*cnt),run_time);
}
else{
Time_Start = clock();
for(i=0;i<cnt;i++){
if(error <=0)
{
perror("error:");
printf("write is fail\n");
free(realbuff);
return -1;
}
}

Time_End = clock();
run_time = (double)(Time_End-Time_Start)/CLOCKS_PER_SEC;
printf( "read %d M cost times:%f s\n",(szie*cnt),run_time);
}

free(realbuff);
close(fd);
return 0;
}

#include <sys/time.h>
long  get_ms()
{
struct timeval t;
long tick;
gettimeofday(&t,0);
tick=(long)(t.tv_sec)*1000+(long)(t.tv_usec)/1000;
return tick;
}

linux硬盘数率 相关内容

2008-11-16 02:45:00 iteye_4515 阅读数 485
• 网络工程师信道数据传输速率与码元速率强化训练教程

网络工程师考试考察知识点繁多，形式多样。如何有效把握每种考察形式，拿到相应分数？这是历年考生挠头的事情。本系列课程紧抓考生痛点，对网工考试中重点题型分门别类讲解,反复强化训练，助力考生查缺补漏，拿到相应分数。本次分课程重点讲解了信道数据传输速率与码元速率的计算方法。通过基本概念阐述->历年真题强化训练->独家解题技巧总结，三大步骤帮助考生掌握信道数据传输速率与码元速率的计算方法，拿到相应分数。

2955 人正在学习 去看看 徐朋

sudo apt-get install hdparm

sudo hdparm -v -i /dev/sda

linux硬盘数率 相关内容

2013-03-14 23:35:59 ruiqingzheng 阅读数 378
• 网络工程师信道数据传输速率与码元速率强化训练教程

网络工程师考试考察知识点繁多，形式多样。如何有效把握每种考察形式，拿到相应分数？这是历年考生挠头的事情。本系列课程紧抓考生痛点，对网工考试中重点题型分门别类讲解,反复强化训练，助力考生查缺补漏，拿到相应分数。本次分课程重点讲解了信道数据传输速率与码元速率的计算方法。通过基本概念阐述->历年真题强化训练->独家解题技巧总结，三大步骤帮助考生掌握信道数据传输速率与码元速率的计算方法，拿到相应分数。

2955 人正在学习 去看看 徐朋

1 指定第一个IDE硬盘的PCI总线指定为32位，
 # /sbin/hdparm -c 1 /dev/hda
使用 -c 0参数来禁用32位传输。

2 使用DMA传输方式

 shell > hdparm -t /dev/hda #察看/dev/hda: Timing buffered disk reads: 14 MB in 3.45 seconds = 4.06 MB/sec shell > hdparm -d 1 /dev/hdashell > hdparm -t /dev/hda /dev/hda: Timing buffered disk reads: 82 MB in 3.02 seconds = 27.15 MB/sec shell > hdparm -k 1 /dev/hda  # 保存设置

3 查看硬盘参数

 [root@localhost root]# hdparm -v /dev/hda/dev/hda: multcount    = 16 (on) IO_support   =  1 (32-bit) unmaskirq    =  0 (off) using_dma    =  1 (on) keepsettings =  1 (on) readonly     =  0 (off) readahead    =  8 (on) geometry     = 4865/255/63, sectors = 78165360, start = 0

4 hdparm其他常用参数

 -g 显示硬盘的磁轨，磁头，磁区等参数。 　　-i 显示硬盘的硬件规格信息，这些信息是在开机时由硬盘本身所提供。 　　-I 直接读取硬盘所提供的硬件规格信息。 　　-p 设定硬盘的PIO模式。 　　-Tt 评估硬盘的读取效率和硬盘快取的读取效率。 　　-u <0或1> 在硬盘存取时，允许其他中断要求同时执行。　-v 显示硬盘的相关设定。

0

linux硬盘数率 相关内容

2018-09-04 13:48:23 weixin_40343504 阅读数 1013
• 网络工程师信道数据传输速率与码元速率强化训练教程

网络工程师考试考察知识点繁多，形式多样。如何有效把握每种考察形式，拿到相应分数？这是历年考生挠头的事情。本系列课程紧抓考生痛点，对网工考试中重点题型分门别类讲解,反复强化训练，助力考生查缺补漏，拿到相应分数。本次分课程重点讲解了信道数据传输速率与码元速率的计算方法。通过基本概念阐述->历年真题强化训练->独家解题技巧总结，三大步骤帮助考生掌握信道数据传输速率与码元速率的计算方法，拿到相应分数。

2955 人正在学习 去看看 徐朋

1、 通过命令“lspci -vvv |grep “Non-Volatile””查询被测PCIE SSD NVMe卡是否被识别到
#lspci -vvv |grep “Non-Volatile”

2、通过lspci查询命令lspci -s 85:00.0 -vvvxxx |grep “Speed”（85:0.0为ID号），查询PCIE SSD NVMe卡的最大速率和link协商速率是否正确
#lspci -s 85:00.0 -vvvxxx |grep “Speed”

3、执行以下命令，通知操作系统对此设备下电。以下命令中的“$slot”为设备实际在服务器中的槽位号。 echo 0 > /sys/bus/pci/slots/$slot/power
\$slot是采用lspci –vvv –ns 85:00.0 |grep Phy 命令查出来的Physical Slot number；
4.在30s后，再将被测PCIe硬盘插回先前的槽位，查询被测NVME硬盘端口速率协商是否正常。重复步骤2。

PS:Linux PCIE相关知识总结
1.首先我们先來复习一下 PCI-E bus 的速度上限.
• PCI Express 1.1

x1 2.5Gbps (20% overhead – PCI-e 在每八个位元的资料串上用十位元來加以编码) 2Gbps (250 MB/sec)
x4 10Gbps 8Gbps (1 GB/sec)
x8 20Gbps 16Gbps (2GB/sec)
x16 40Gbps 32Gbps (4GB/sec)
• PCI Express 2.0
PCI-SIG 的 PCI Express 2.0规格,新版每条 Lane 的单向频宽 2.5Gbps 倍增到 5Gbps.
x1 5Gbps (20% overhead – PCI-e 并且在每八个位元的资料串上用十位元來加以编码) 4Gbps (500 MB/sec)
(5G*0.8)Mb/8=500MB
x4 20Gbps 16Gbps (2 GB/sec)
x8 40Gbps 32Gbps (4 GB/sec)
x16 80Gbps 64Gbps (8 GB/sec)
• PCI Express 3.0
PCI-SIG 的 PCI Express 3.0 规格,新版每条 Lane 的单向频宽增到 8Gbps.

x1 8Gbps (1GB/sec)
x4 32Gbps (4 GB/sec)
x8 64Gbps (8 GB/sec)
x16 128Gbps (16 GB/sec)
2.在 PCI 的裝置使用三个编号用來当做识别值,分别为
a.汇流排(bus number), b.装置 (device number) c. 功能(function number).（例如刚刚的 85:00.0 就是 bus number = 85 ,device number = 00 function = 0 ）

a. 汇流排(bus number) 8bits 2^8 至多可链接 256 个汇流排(0 to ff).
b. 装置(device number) 5bits 2^5 至多可接 32 种裝置(0 to 1f).
c. 功能(function number) 3bits 2^3 至多每种裝置可有 8 项功能(0 to 7).
3.
LnkSta :

LnkCap :

LnkSta 和 LnkCap 这两个速度有可能不一樣 ,系統所提供的是 PCI Express 是 2.0 但裝置还是使用 1.0 的.

linux硬盘数率 相关内容

2019-09-26 14:37:29 qq_38639426 阅读数 150
• 网络工程师信道数据传输速率与码元速率强化训练教程

网络工程师考试考察知识点繁多，形式多样。如何有效把握每种考察形式，拿到相应分数？这是历年考生挠头的事情。本系列课程紧抓考生痛点，对网工考试中重点题型分门别类讲解,反复强化训练，助力考生查缺补漏，拿到相应分数。本次分课程重点讲解了信道数据传输速率与码元速率的计算方法。通过基本概念阐述->历年真题强化训练->独家解题技巧总结，三大步骤帮助考生掌握信道数据传输速率与码元速率的计算方法，拿到相应分数。

2955 人正在学习 去看看 徐朋

LINUX系统写速度问题解决过程

问题描述：

linux系统下写速度只有2GB/s左右，无法支持2.5G采样率连续采集，达不到预期的性能。而同样的代码在windows系统下，却可以支持2.5G采样率连续采集，因此这里需要解决Linux系统的写速度问题。

结论：

a. 定位用户数据

b. 将用户数据拷贝至内核中(page cache)

---用户层---

a. 定位用户数据

b. 将用户数据拷贝至函数的缓存中(函数调用返回)

---vfs层（即虚拟文件系统）---

c. 将函数缓存拷贝至内核缓存(page cache) (显式或隐式调用fflush() )

d. 将page cache中的脏数据写入磁盘数据区(调用硬盘驱动)

e. 将inode cache中的脏数据写入磁盘inode区(调用硬盘驱动)

---存储控制器层---

f. 从板载cache(比如ssd raid 卡)中读取数据

g. 将数据写入磁盘介质

#define _GNU_SOURCE 1

#define __USE_GNU 1

#include <stdio.h>

#include <assert.h>

#include <fcntl.h>

#include <getopt.h>

#include <stdint.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <time.h>

#include <sys/mman.h>

#include <sys/stat.h>

#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>

static void *mmap_control(int fd,long mapsize)

{

}

void* pvAllocMemPageAligned (uint64_t qwBytes)

{

void* pvTmp;

int fd = open ("/dev/zero", O_RDONLY);

pvTmp = (void*) mmap (NULL, qwBytes, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);

// set everything to zero to get memory allocated in physical mem

if (pvTmp != MAP_FAILED)

memset (pvTmp, 0, qwBytes);

else

pvTmp = NULL;

close (fd);

return (pvTmp);

}

// ***********************************************************************

void vFreeMemPageAligned (void* pvAdr, uint64_t qwBytes)

{

}

static void timespec_sub(struct timespec *t1, const struct timespec *t2);

int main()

{

printf("CLOCKPERSEC=%ld\n",CLOCKS_PER_SEC);

char filename[64] = "/home/sample/SampleData/testspeed_rcv.bin";

int file_fd = open(filename, O_RDWR | O_CREAT | O_TRUNC|O_DIRECT, 0666);

if(file_fd<0)

{

perror("rcv file err:");

}

int rc;

int size=2*1024*1024;

//char buffer[4*1024*1024]={0};

void *buffer=NULL;

buffer=pvAllocMemPageAligned(4*1024*1024);

/*void* control_base;

control_base=mmap_control(file_fd,size);

if(control_base=NULL||control_base==(void*) -1)

{

printf("映射失败\n");

close(file_fd);

return -1;

}*/

struct timespec ts_start, ts_end;

clock_gettime(CLOCK_MONOTONIC, &ts_start);

clock_t start1,end1;

start1=clock();

printf("flag1\n");

int times=1000;

for(int i=0;i<times;i++)

{

//memcpy(control_base,buffer,size);

rc= write(file_fd, buffer, size);

if(rc!=size){

perror("write error:");

return -1;

}

}

end1=clock();

printf("flag2\n");

clock_gettime(CLOCK_MONOTONIC, &ts_end);

float dur1=(float)(end1-start1);

printf("Cost Time=%f\n",(dur1/CLOCKS_PER_SEC));

printf("rc=%d\n",rc);

timespec_sub(&ts_end, &ts_start);

printf("Cost %ld.%09ld seconds (total) for transfer \n",

ts_end.tv_sec, ts_end.tv_nsec);

printf("Write Speed=%f\n",(float)(size/1024/1024*times)/(ts_end.tv_sec+ts_end.tv_nsec/1e9));

/*if(munmap(control_base,size)==-1)

{

printf("munmap error!\n");

}*/

close(file_fd);

file_fd=open(filename,O_RDWR|O_DIRECT);

if(file_fd<0)

{

perror("rcv file err:");

}

start1=clock();

clock_gettime(CLOCK_MONOTONIC, &ts_start);

for(int i=0;i<times;i++)

{

//memcpy(control_base,buffer,size);

if(rc!=size)

{

printf("rc=%d\n",rc);

}

}

clock_gettime(CLOCK_MONOTONIC, &ts_end);

end1=clock();

dur1=(float)(end1-start1);

printf("\n\nCost Time=%f\n",(dur1/CLOCKS_PER_SEC));

printf("rc=%d\n",rc);

timespec_sub(&ts_end, &ts_start);

printf("Cost %ld.%09ld seconds (total) for transfer \n",

ts_end.tv_sec, ts_end.tv_nsec);

close(file_fd);

vFreeMemPageAligned(buffer,4*1024*1024);

}

static void timespec_sub(struct timespec *t1, const struct timespec *t2)

{

assert(t1->tv_nsec >= 0);

assert(t1->tv_nsec < 1000000000);

assert(t2->tv_nsec >= 0);

assert(t2->tv_nsec < 1000000000);

t1->tv_sec -= t2->tv_sec;

t1->tv_nsec -= t2->tv_nsec;

if (t1->tv_nsec >= 1000000000)

{

t1->tv_sec++;

t1->tv_nsec -= 1000000000;

}

else if (t1->tv_nsec < 0)

{

t1->tv_sec--;

t1->tv_nsec += 1000000000;

}

}



linux硬盘数率 相关内容