mirror of
https://github.com/mongodb/mongo.git
synced 2024-11-30 17:10:48 +01:00
135 lines
4.1 KiB
C++
135 lines
4.1 KiB
C++
#include "stdafx.h"
|
|
#include <stdio.h>
|
|
#include "../util/goodies.h"
|
|
#include <fcntl.h>
|
|
|
|
namespace mongo {
|
|
|
|
#if defined(F_FULLFSYNC)
|
|
void fullsync(int f) {
|
|
fcntl( f, F_FULLFSYNC );
|
|
}
|
|
#else
|
|
void fullsync(int f) {
|
|
fdatasync(f);
|
|
}
|
|
#endif
|
|
|
|
int main(int argc, char* argv[], char *envp[] ) {
|
|
cout << "hello" << endl;
|
|
|
|
FILE *f = fopen("/data/db/temptest", "a");
|
|
|
|
if ( f == 0 ) {
|
|
cout << "can't open file\n";
|
|
return 1;
|
|
}
|
|
|
|
{
|
|
Timer t;
|
|
for ( int i = 0; i < 50000; i++ )
|
|
fwrite("abc", 3, 1, f);
|
|
cout << "small writes: " << t.millis() << "ms" << endl;
|
|
}
|
|
|
|
{
|
|
Timer t;
|
|
for ( int i = 0; i < 10000; i++ ) {
|
|
fwrite("abc", 3, 1, f);
|
|
fflush(f);
|
|
fsync( fileno( f ) );
|
|
}
|
|
int ms = t.millis();
|
|
cout << "flush: " << ms << "ms, " << ms / 10000.0 << "ms/request" << endl;
|
|
}
|
|
|
|
{
|
|
Timer t;
|
|
for ( int i = 0; i < 500; i++ ) {
|
|
fwrite("abc", 3, 1, f);
|
|
fflush(f);
|
|
fsync( fileno( f ) );
|
|
sleepmillis(2);
|
|
}
|
|
int ms = t.millis() - 500 * 2;
|
|
cout << "flush with sleeps: " << ms << "ms, " << ms / 500.0 << "ms/request" << endl;
|
|
}
|
|
|
|
char buf[8192];
|
|
for ( int pass = 0; pass < 2; pass++ ) {
|
|
cout << "pass " << pass << endl;
|
|
{
|
|
Timer t;
|
|
int n = 500;
|
|
for ( int i = 0; i < n; i++ ) {
|
|
if ( pass == 0 )
|
|
fwrite("abc", 3, 1, f);
|
|
else
|
|
fwrite(buf, 8192, 1, f);
|
|
buf[0]++;
|
|
fflush(f);
|
|
fullsync(fileno(f));
|
|
}
|
|
int ms = t.millis();
|
|
cout << "fullsync: " << ms << "ms, " << ms / ((double) n) << "ms/request" << endl;
|
|
}
|
|
|
|
{
|
|
Timer t;
|
|
for ( int i = 0; i < 500; i++ ) {
|
|
if ( pass == 0 )
|
|
fwrite("abc", 3, 1, f);
|
|
else
|
|
fwrite(buf, 8192, 1, f);
|
|
buf[0]++;
|
|
fflush(f);
|
|
fullsync(fileno(f));
|
|
sleepmillis(2);
|
|
}
|
|
int ms = t.millis() - 2 * 500;
|
|
cout << "fullsync with sleeps: " << ms << "ms, " << ms / 500.0 << "ms/request" << endl;
|
|
}
|
|
}
|
|
|
|
// without growing
|
|
{
|
|
fclose(f);
|
|
/* try from beginning of the file, where we aren't appending and changing the file length,
|
|
to see if this is faster as the directory entry then doesn't have to be flushed (if noatime in effect).
|
|
*/
|
|
f = fopen("/data/db/temptest", "r+");
|
|
Timer t;
|
|
int n = 500;
|
|
for ( int i = 0; i < n; i++ ) {
|
|
fwrite("xyz", 3, 1, f);
|
|
fflush(f);
|
|
fullsync(fileno(f));
|
|
}
|
|
int ms = t.millis();
|
|
cout << "fullsync without growing: " << ms << "ms, " << ms / ((double) n) << "ms/request" << endl;
|
|
}
|
|
|
|
// without growing, with delay
|
|
{
|
|
fclose(f);
|
|
/* try from beginning of the file, where we aren't appending and changing the file length,
|
|
to see if this is faster as the directory entry then doesn't have to be flushed (if noatime in effect).
|
|
*/
|
|
f = fopen("/data/db/temptest", "r+");
|
|
Timer t;
|
|
int n = 500;
|
|
for ( int i = 0; i < n; i++ ) {
|
|
fwrite("xyz", 3, 1, f);
|
|
fflush(f);
|
|
fullsync(fileno(f));
|
|
sleepmillis(2);
|
|
}
|
|
int ms = t.millis() - 2 * 500;
|
|
cout << "fullsync without growing with sleeps: " << ms << "ms, " << ms / ((double) n) << "ms/request" << endl;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
} // namespace mongo
|