ceph/src/psim.cc

89 lines
2.2 KiB
C++
Raw Normal View History

2008-04-15 17:07:23 +00:00
#include <iostream>
#include "crush/CrushWrapper.h"
#include "osd/OSDMap.h"
#include "config.h"
#include "include/buffer.h"
2008-09-18 21:30:47 +00:00
int main(int argc, char **argv)
2008-04-15 17:07:23 +00:00
{
/*
* you need to create a suitable osdmap first. e.g., for 40 osds,
* $ ./osdmaptool --createsimple .ceph_monmap 40 --clobber .ceph_osdmap
*/
bufferlist bl;
bl.read_file(".ceph_osdmap");
OSDMap osdmap;
osdmap.decode(bl);
int n = osdmap.get_max_osd();
int count[n];
for (int i=0; i<n; i++) {
2008-05-20 04:28:42 +00:00
osdmap.set_state(i, osdmap.get_state(i) | CEPH_OSD_UP);
2009-05-13 21:56:28 +00:00
//if (i<8)
osdmap.set_weight(i, CEPH_OSD_IN);
2008-04-15 17:07:23 +00:00
count[i] = 0;
}
2009-05-13 21:56:28 +00:00
int size[4];
for (int i=0; i<4; i++)
size[i] = 0;
2009-08-04 19:53:22 +00:00
for (int f = 0; f < 50000; f++) { // files
2008-04-15 17:07:23 +00:00
for (int b = 0; b < 4; b++) { // blocks
2009-08-04 19:53:22 +00:00
char foo[20];
sprintf(foo, "%d.%d", f, b);
object_t oid(foo);
2009-05-13 21:56:28 +00:00
ceph_object_layout l = osdmap.make_object_layout(oid, 0);
2009-08-04 19:53:22 +00:00
//osdmap.file_to_object_layout(oid, g_default_file_layout);
2008-04-15 17:07:23 +00:00
vector<int> osds;
2008-09-18 21:30:47 +00:00
pg_t pgid = pg_t(l.ol_pgid);
2009-08-04 19:53:22 +00:00
//pgid.u.ps = f * 4 + b;
2008-09-18 21:30:47 +00:00
osdmap.pg_to_osds(pgid, osds);
2009-05-13 21:56:28 +00:00
size[osds.size()]++;
2009-08-11 23:14:41 +00:00
#if 0
2009-08-04 19:53:22 +00:00
if (0) {
hash<object_t> H;
int x = H(oid);
x = ceph_stable_mod(x, 1023, 1023);
int s = crush_hash32(x) % 15;
//cout << "psim: x = " << x << " s = " << s << std::endl;
//osds[0] = s;
}
2009-08-11 23:14:41 +00:00
#endif
2009-08-04 19:53:22 +00:00
//osds[0] = crush_hash32(f) % n;
2009-05-13 21:56:28 +00:00
//cout << "oid " << oid << " pgid " << pgid << " on " << osds << std::endl;
2008-04-15 17:07:23 +00:00
for (unsigned i=0; i<osds.size(); i++) {
//cout << " rep " << i << " on " << osds[i] << std::endl;
count[osds[i]]++;
}
}
}
2009-08-04 19:53:22 +00:00
__u64 avg = 0;
2008-04-15 17:07:23 +00:00
for (int i=0; i<n; i++) {
cout << "osd" << i << "\t" << count[i] << std::endl;
2009-08-04 19:53:22 +00:00
avg += count[i];
2008-04-15 17:07:23 +00:00
}
2009-08-04 19:53:22 +00:00
avg /= n;
double dev = 0;
for (int i=0; i<n; i++)
dev += (avg - count[i]) * (avg - count[i]);
dev /= n;
dev = sqrt(dev);
double pgavg = (double)osdmap.get_pg_pool(0).get_pg_num() / (double)n;
double edev = sqrt(pgavg) * (double)avg / pgavg;
cout << " avg " << avg
<< " stddev " << dev
<< " (expected " << edev << ")"
<< " (indep object placement would be " << sqrt(avg) << ")" << std::endl;
2009-05-13 21:56:28 +00:00
for (int i=0; i<4; i++) {
cout << "size" << i << "\t" << size[i] << std::endl;
}
2008-04-15 17:07:23 +00:00
return 0;
}