История изменений
Исправление
cumvillain,
(текущая версия)
:
С другой стороны, у него в тестах есть явный нюанс: fio пишет/читает с O_DIRECT. Большой вопрос в том оптимизировали ли под такое bcachefs.
Собственно, вот его direct write:
ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter)
{
struct file *file = req->ki_filp;
struct address_space *mapping = file->f_mapping;
struct bch_inode_info *inode = file_bch_inode(file);
struct bch_fs *c = inode->v.i_sb->s_fs_info;
struct dio_write *dio;
struct bio *bio;
bool locked = true, extending;
ssize_t ret;
prefetch(&c->opts);
prefetch((void *) &c->opts + 64);
prefetch(&inode->ei_inode);
prefetch((void *) &inode->ei_inode + 64);
inode_lock(&inode->v);
ret = generic_write_checks(req, iter);
if (unlikely(ret <= 0))
goto err;
[...]
Здесь inode_lock()
это семафор. То есть fio с O_DIRECT как минимум натыкается на семафор (который в отличии от спинлока может спать) в параллельных запросах в один файл. Хз насколько сильно это влияет в данном случае (я мало что смыслю в fs/), но это может добавлять проблем.
Исправление
cumvillain,
:
С другой стороны, у него в тестах есть явный нюанс: fio пишет/читает с O_DIRECT. Большой вопрос в том оптимизировали ли под такое bcachefs.
Собственно, вот его direct write:
ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter)
{
struct file *file = req->ki_filp;
struct address_space *mapping = file->f_mapping;
struct bch_inode_info *inode = file_bch_inode(file);
struct bch_fs *c = inode->v.i_sb->s_fs_info;
struct dio_write *dio;
struct bio *bio;
bool locked = true, extending;
ssize_t ret;
prefetch(&c->opts);
prefetch((void *) &c->opts + 64);
prefetch(&inode->ei_inode);
prefetch((void *) &inode->ei_inode + 64);
inode_lock(&inode->v);
ret = generic_write_checks(req, iter);
if (unlikely(ret <= 0))
goto err;
[...]
Здесь inode_lock()
это семафор. То есть fio с O_DIRECT как минимум натыкается на семафор в параллельных запросах в один файл. Хз насколько сильно это влияет в данном случае (я мало что смыслю в fs/), но это может добавлять проблем.
Исправление
cumvillain,
:
С другой стороны, у него в тестах есть явный нюанс: fio пишет/читает с O_DIRECT. Большой вопрос в том оптимизировали ли под такое bcachefs.
Собственно, вот его direct write:
ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter)
{
struct file *file = req->ki_filp;
struct address_space *mapping = file->f_mapping;
struct bch_inode_info *inode = file_bch_inode(file);
struct bch_fs *c = inode->v.i_sb->s_fs_info;
struct dio_write *dio;
struct bio *bio;
bool locked = true, extending;
ssize_t ret;
prefetch(&c->opts);
prefetch((void *) &c->opts + 64);
prefetch(&inode->ei_inode);
prefetch((void *) &inode->ei_inode + 64);
inode_lock(&inode->v);
ret = generic_write_checks(req, iter);
if (unlikely(ret <= 0))
goto err;
[...]
Здесь inode_lock()
это семафор. По сути fio с O_DIRECT в данном случае пишет с глубиной 1.
Исправление
cumvillain,
:
С другой стороны, у него в тестах есть явный нюанс: fio пишет/читает с O_DIRECT. Большой вопрос в том оптимизировали ли под такое bcachefs.
Собственно, вот его direct write:
ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter)
{
struct file *file = req->ki_filp;
struct address_space *mapping = file->f_mapping;
struct bch_inode_info *inode = file_bch_inode(file);
struct bch_fs *c = inode->v.i_sb->s_fs_info;
struct dio_write *dio;
struct bio *bio;
bool locked = true, extending;
ssize_t ret;
prefetch(&c->opts);
prefetch((void *) &c->opts + 64);
prefetch(&inode->ei_inode);
prefetch((void *) &inode->ei_inode + 64);
inode_lock(&inode->v);
ret = generic_write_checks(req, iter);
if (unlikely(ret <= 0))
goto err;
[...]
Здесь inode_lock()
это семафор. Поэтому, по сути fio с O_DIRECT в данном случае пишет с глубиной 1.
Исходная версия
cumvillain,
:
С другой стороны, у него в тестах есть явный нюанс: fio пишет/читает с O_DIRECT. Большой вопрос в том оптимизировали ли под такое bcachefs.