[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [MirageOS-devel] Mirage questions from writing a REST service

On 7 Jul 2014, at 10:08, Thomas Leonard <talex5@xxxxxxxxx> wrote:

> I'm writing a test Mirage service for queuing files. It's not using
> ThomasG's merge-queues - I'm just trying the low-level FS stuff first.
> Some problems I found:
> 1. Running as a --unix process, I initially got a download speed of
> 230 KB/s. Increasing the size of the chunks I was reading from the Fat
> filesystem (a disk.img file) from 512 bytes to 1MB, I was able to
> increase this to 3 MB/s. Both seem rather low. Apache on the same
> machine gets 615 MB/s!

Yep, this is expected, since we explicitly don't have a buffer cache
in the way and so everything you're doing is hitting the disk (and
going through a not-very-optimized FAT implementation into the bargain).

The plan here is to define a buffer cache that's a functor over FS,
and then apply it in config.ml (perhaps through a helper library function).

> I tried reproducing it with mirage-skeleton/static_website, but it
> didn't want to know:
> $ git clone https://github.com/mirage/mirage-skeleton.git
> $ cd mirage-skeleton/static_website
> $ FS=fat NET=socket mirage configure --unix
> [ note: my actual test file is not all zeros, but for this email... ]
> $ dd if=/dev/zero of=htdocs/data bs=1024 count=2
> $ ./make-fat1-image.sh
> $ make
> $ ./mir-www
> Manager: connect
> Manager: configuring
> Manager: socket config currently ignored (TODO)
> Fatal error: exception Failure("fat2")

That's not a helpful error... any ideas ThomasG/Dave?

> 2. To be able to use the FS inferface, I had to specialise it like this:
> module type FS = V1_LWT.FS with
>  type page_aligned_buffer = Cstruct.t and
>  type block_device_error = Fat.Fs.block_error

Ugh, the page_aligned_buffer remaining abstract in V1_LWT is definitely
a bug:

(** FS *)
module type FS = FS
  with type 'a io = 'a Lwt.t

(all the other definitions override it).  Could you file a bug about
this?  Best fixed in the 2.x branch.

> This means my unikernel only works with Fat. If I don't do this, I
> can't report or log error messages. I guess this is also why the test
> above gave such a useless error. Are there any plans to make error
> handling easier?

Dave, what are your thoughts on this?  That is indeed a distinctly
abstract-looking block device error :-)

> 3. In my tags file, I use:
>  not <main.*>: warn(A)
> Would be nice if the generated main.ml compiled without warnings (this
> might be related to the previous point, as it's the error details that
> it is ignoring).

Worth filing a bug for this too.

> 4. Can I get mirage to generate a Makefile that builds and runs my
> unit-tests? I guess I can't run the unit-tests when in --xen mode,
> because some modules have conflicting names, but it would be nice in
> --unix mode at least.

Need some more details on the nature of these unit tests, as I don't
understand what you mean by 'conflicting names'.  Can each unit test
be compiled as a separate unikernel (so it'll work on Xen) via some
config.ml code?


MirageOS-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.