Why if i write to a raw hard disk (without FS) the kernel also makes reads.
$ sudo dd if=/dev/zero of=/dev/sda bs=32k count=1 oflag=direct status=none
$ iostat -xc 1 /dev/sda | grep -E "Device|sda"
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 45,54 0,99 1053,47 31,68 0,00 0,00 0,00 0,00 1,17 3071,00 3,04 23,13 32,00 66,38 308,91
Is it readahead?
Instead of
dd
i wrote a c program that does the same, i even used posix_fadvise
to hint the kernel that i do not want read ahead.
#include
#include
#include
#include
#include
#include
#define _GNU_SOURCE
#define BLOCKSIZE 512
#define COUNT 32768
int main(void)
{
// read COUNT bytes from /dev/zero
int fd;
mode_t mode = O_RDONLY;
char *filename = "/dev/zero";
fd = openat(AT_FDCWD, filename, mode);
if (fd < 0) {
perror("Creation error");
exit (1);
}
void *pbuf;
posix_memalign(&pbuf, BLOCKSIZE, COUNT);
size_t a;
a = COUNT;
ssize_t ret;
ret = read(fd, pbuf, a);
if (ret < 0) {
perror("read error");
exit (1);
}
close (fd);
// write COUNT bytes to /dev/sda
int f = open("/dev/sda", O_WRONLY|__O_DIRECT);
ret = posix_fadvise (f, 0, COUNT, POSIX_FADV_NOREUSE);
if (ret < 0)
perror ("posix_fadvise");
ret = write(f, pbuf, COUNT);
if (ret < 0) {
perror("write error");
exit (1);
}
close(f);
free(pbuf);
return 0;
}
But the result is the same
$ iostat -xc 1 /dev/sda | grep -E "Device|sda"
Device r/s w/s rkB/s wkB/s r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 46,00 1,00 1064,00 32,00 10,78 1,00 0,43 23,13 32,00 10,55 49,60
It does not matter if it is a spindel disk or ssd , the result is the same.
Also tried different kernels.
Asked by Alex
(923 rep)
Jun 18, 2024, 10:53 AM
Last activity: Jun 20, 2024, 03:22 PM
Last activity: Jun 20, 2024, 03:22 PM