Hi
On Wed, Dec 17, 2014 at 2:39 PM, Alvaro Herrera
<[email protected]> wrote:
> didier wrote:
>
>> On many Linux systems it may not do that much (2.6.32 and 3.2 are bad,
>> 3.13 is better but still it slows the fsync).
>>
>> If there's a fsync in progress WALReceiver will:
>> 1- slow the fsync because its writes to the same file are grabbed by the
>> fsync
>> 2- stall until the end of fsync.
>
> Is this behavior filesystem-dependent?
I don't know. I only tested ext4
Attach the trivial code I used, there's a lot of junk in it.
Didier
/*
* Compile with: gcc testf.c -Wall -W -O0
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <sys/time.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/file.h>
#include <errno.h>
static long long microseconds(void) {
struct timeval tv;
long long mst;
gettimeofday(&tv, NULL);
mst = ((long long)tv.tv_sec)*1000000;
mst += tv.tv_usec;
return mst;
}
int out= 0;
//#define FLOCK(a,b) flock(a,b)
#define FLOCK(a,b) (0)
//==================
// fsync
void child(void) {
int fd, retval;
long long start;
while(1) {
fd = open("/tmp/foo.txt",O_RDONLY);
//usleep(30000000);
usleep(5000000);
FLOCK(fd, LOCK_EX);
if (out) {
printf("Start sync\n");
fflush(stdout);
start = microseconds();
}
retval = fsync(fd);
FLOCK(fd, LOCK_UN);
if (out) {
printf("Sync in %lld microseconds (%d)\n", microseconds()-start,retval);
fflush(stdout);
}
close(fd);
}
exit(0);
}
char buf[8*1024];
#define f_size (2lu*1024*1024*1024)
//==================
// read
void child2(void) {
int fd, retval;
long long start;
off_t lfsr;
fd = open("/tmp/foo.txt",O_RDWR /*|O_CREAT | O_SYNC*/,0644);
srandom(2000 +time(NULL));
while(1) {
if (out) {
start = microseconds();
}
lfsr = random()/sizeof(buf);
if (pread (fd, buf, sizeof(buf), sizeof(buf)*lfsr) == -1) {
perror("read");
exit(1);
}
// posix_fadvise(fd, sizeof(buf)*lfsr, sizeof(buf), POSIX_FADV_DONTNEED);
if (out) {
printf("read %lu in %lld microseconds\n", lfsr *sizeof(buf), microseconds()-start);
fflush(stdout);
}
usleep(500);
}
close(fd);
exit(0);
}
//==================
void child3(int end) {
int fd, retval;
long long start;
off_t lfsr;
int i;
int j = 2;
fd = open("/tmp/foo.txt",O_RDWR /*|O_CREAT | O_SYNC*/,0644);
for (i = 0; i < 131072/j; i++) {
int u;
lseek(fd, sizeof(buf)*(i*j), SEEK_SET);
write(fd, buf , sizeof(buf));
}
close(fd);
if (end)
exit(0);
sleep(60);
}
int main(void) {
int fd0 = open("/tmp/foo.txt",O_RDWR |O_CREAT /*| O_SYNC*/,0644);
int fd1 = open("/tmp/foo1.txt",O_RDWR |O_CREAT /*| O_SYNC*/,0644);
int fd;
long long start;
long long end = 0;
off_t lfsr = 0;
memset(buf, 'a', sizeof(buf));
ftruncate(fd0, f_size);
ftruncate(fd1, f_size);
printf ("%d\n",RAND_MAX);
// child3(0);
if (!fork()) {
child();
exit(1);
}
#if 0
if (!fork()) {
child2();
exit(1);
}
if (!fork()) {
child3(1);
exit(1);
}
#endif
srandom(1000+time(NULL));
while(1) {
fd = fd0;
if (FLOCK(fd, LOCK_EX| LOCK_NB) == -1) {
if (errno == EWOULDBLOCK)
fd =fd1;
}
lfsr = random()/sizeof(buf);
if (out) {
start = microseconds();
}
// if (pwrite(fd ,buf ,sizeof(buf), sizeof(buf)*lfsr) == -1) {
lseek(fd, sizeof(buf)*lfsr, SEEK_SET);
if (write(fd,buf,sizeof(buf)) == -1) {
perror("write");
exit(1);
}
if (out) {
printf("Write %lu in %lld microseconds\n", lfsr *sizeof(buf), microseconds()-start);
fflush(stdout);
}
if (fd == fd0) {
FLOCK(fd, LOCK_UN);
}
usleep(20000);
}
close(fd);
exit(0);
}
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers