CITI ASC status

From Linux NFS

(Difference between revisions)
Jump to: navigation, search
(Task 2. Migration of client from one mount/metadata server to another to be demonstrated. This demonstration may be replicated at LANL depending on success of this work.)
(Development)
Line 15: Line 15:
* Block layout driver (CITI).
* Block layout driver (CITI).
-
To accommodate the requirements of the multiple layout drivers, we expanded the layout operation policy interfaces between the layout driver and generic pNFS client.
+
To accommodate the requirements of the multiple layout drivers, we expanded the policy interface between the layout driver and generic pNFS client. This interface allows layout drivers to set the following policies:
 +
* stripe size
 +
* writeback cache gathering policies
 +
* blocksize
 +
* read and write threshold
 +
* timing of layoutget invocation
 +
* determine if I/O uses pagecache or direct method
 +
 
We are designing and coding a pNFS client layout cache to replace the current implementation, which supports only a single layout per inode.
We are designing and coding a pNFS client layout cache to replace the current implementation, which supports only a single layout per inode.

Revision as of 15:36, 19 October 2006

Contents

University of Michigan/CITI NFSv4 ASC alliance

Status of October 2006

Task 1. Demonstration of pNFS with multiple back end methods (PVFS2 and File) including layout recall — LANL will replicate this demonstration at LANL working with CITI remotely.

Development

We updated the Linux pNFS client and server to the 2.6.17 kernel level, and are preparing to rebase again for 2.6.19.

We updated the pNFS code base to draft-ietf-nfsv4-minorversion1-05. Testing identified multiple bugs, which we fixed.

The linux client separates common NFS code from NFSv2/3/4 code by using version specific operations. We rewrote the Linux pNFS client to use its own set of version specfic operations. This provides a controlled interface to the pNFS code, and eases updating the code to new kernel versions.

Four client layout modules are in development.

  • File layout driver (CITI, Network Appliance, and IBM Almaden).
  • PVFS2 layout driver (CITI).
  • Object layout driver (Panasas).
  • Block layout driver (CITI).

To accommodate the requirements of the multiple layout drivers, we expanded the policy interface between the layout driver and generic pNFS client. This interface allows layout drivers to set the following policies:

  • stripe size
  • writeback cache gathering policies
  • blocksize
  • read and write threshold
  • timing of layoutget invocation
  • determine if I/O uses pagecache or direct method


We are designing and coding a pNFS client layout cache to replace the current implementation, which supports only a single layout per inode.

We improved the interface to the underlying file system on the Linux pNFS server. The new interface is being used by the Panasas object layout server, the IBM GPFS server, and the PVFS2 server.

We are coding the pNFS layout management service and file system interfaces on the Linux pNFS server to do a better job of bookkeeping so that we can extend the layout recall implementation, which is limited to a single layout.

We have continued to develop the PVFS2 layout driver and PVFS2 support in the pNFS server. The layout driver I/O interface supports direct access, page cache access with NFSv4 readahead and writeback, and the O_DIRECT access method. In addition, PVFS2 now supports the pNFS file-based layout, which lets pNFS clients choose how they access the file system.

We demonstrated how pNFS can improve the overall write performance of parallel file systems by using direct, parallel I/O for large write requests and the NFSv4 storage protocol for small write requests. To switch between them, we added a write threshold to the layout driver. Write requests smaller than the threshold follow the slower NFSv4 data path. Write requests larger than the threshold follow the faster layout driver data path. D. Hildebrand, L. Ward, and P. Honeyman, "Large Files, Small Writes, and pNFS," in Proc. of the 20th ACM International Conf. on Supercomputing, Cairns, Australia, 2006.

We improved the performance and scalability of pNFS file-based access with parallel file systems. Our design, named Direct-pNFS, augmented the file-based architecture to enable file-based pNFS clients to bypass intermediate data servers and access heterogeneous data stores directly. Direct access is possible by ensuring file-based layouts match the data layout in the underlying file system and giving pNFS clients the tools to effectively interpret and utilize this information. Experiments with Direct-pNFS demonstrate I/O throughput that equals or outperforms the exported parallel file system across a range of workloads. D. Hildebrand and P. Honeyman, "Direct-pNFS: Simple, Transparent, and Versatile Access to Parallel File Systems," CITI Technical Report 06-8, October 2006.

We developed prototype implementations of pNFS operations:

  • OP_GETDEVICELIST,
  • OP_GETDEVICEINFO,
  • OP_LAYOUTGET,
  • OP_LAYOUTCOMMIT,
  • OP_LAYOUTRETURN and
  • OP_CB_LAYOUTRECALL

We continue to test the ability of our prototype to send direct I/O data to data servers.

Milestones

At the September 2006 NFSv4 Bake-a-thon, hosted by CITI, we continued to test the ability of CITI's Linux pNFS client to operate with multiple layouts, and the ability of CITI's Linux pNFS server to export pNFS capable underlying file systems.

We demonstrated the Linux pNFS client support for multiple layouts by copying files between multiple pNFS back ends.

The following pNFS implementations were tested.

File Layout

  • Clients: Linux, Solaris
  • Servers: Network Appliance, Linux IBM GPFS, DESY dCache, Solaris, PVFS2

Object layout

  • Client: Linux
  • Servers: Linux, Panasas

Block layout

  • Client: Linux
  • Server: EMC

PVFS2 layout

  • Client: Linux
  • Server: Linux

Activities

Our current Linux pNFS implementation uses a single whole file layout. We are extending the layout cache on the client and layout management on the server to support multiple layouts and small byte ranges.

In cooperation with EMC, we continue to develop a block layout driver module for the generic pNFS client.

We continue to measure I/O performance.

We joined the Ultralight project and are testing pNFS I/O using pNFS clients on 10 GbE against pNFS clusters on 1 GbE. The Linux pNFS client included in the Ultralight kernel and distributed to Ultralight sites, providing opportunities for future long-haul WAN testing.

Task 2. Migration of client from one mount/metadata server to another to be demonstrated. This demonstration may be replicated at LANL depending on success of this work.

When a file system moves, the old server notifies clients with NFS4ERR_MOVED. Clients then reclaim state held on the old server by engaging in reboot recovery with the new server. For cluster file systems, server-to-server state transfer lets clients avoid the reclaim.

We redesigned state bookkeeping to ensure that state created on NFSv4 servers exporting the same cluster file system will not collide.

Server reboot recovery requires servers to save the clientid of active clients in stable storage. The present server implementation does this by writing directly to a filesystem via the vfs layer. A new server instance reads the state from stable storage, again directly via the vfs. We are rewriting this implementation to use a pipefs upcall/downcall interface instead of directly using the vfs layer, and are expanding the interface to support an upcall/downcall of all a clients in-memory state. The userland daemon can then support server-to-server state transfer to the cooresponding daemon on a new server. We have a prototype of the new upcall/down call interface, and have yet to prototype the server-to-server state transfer.

It remains to inform clients that state established with the old server remains valid on the new server. The IETF NFSv4 working group is considering solutions for the NFSv4.1 protocol, but NFSv4.0 clients will not have support for this feature. We will therefore need to provide Linux specific implementation support - perhaps a mount option or a /proc flag, or simply to try to use an old clientid against a new server on migration.

Task 3. Analysis of caching and lock coherency, demonstration of caching and lock performance with scaling, under various levels of conflict, using byte range locks (looking at lock splitting issues etc.).

We have set up test machines and begun planning for tests. We have some immediate concerns over the memory footprint imposed by server lock structures.

Task 4. Analysis of directory delegations – how well does it work and when, when does it totally not work.

Background

Directory delegations promise to extend the usefulness of dentry caching in two ways. First, the client is no longer forced to revalidate the dentry cache after a timeout. Second, while positive caching can be treated as a hint, negative caching without cache invalidation violates open-to-close semantics. Directory delegations allow the client to cache negative results.

For example, if a client opens a file that does not exist, it issues an OPEN RPC that fails. But a subsequent open of the same file might succeed, if the file is created in the interim. Open-to-close semantics requires that the newly created file be seen by the client, so the earlier negative result can not be cached. Consequently, subsequent opens of the same non-existent file also require OPEN RPC calls being sent to the server. This example is played out repeatedly when the shell searches for executables in PATH or when the linker searches for shared libraries in LD_LIBRARY_PATH.

With directory delegations, the server callback mechanism can guarantee that no entries have been added or modified in a cached directory, which allows consistent negative caching and eliminates repeated checks for non-existent files.

Status

We implemented directory delegations in the Linux NFSv4 client and server.

Our server implementation follows the file delegations architecture. We extended the lease API in the Linux VFS to support read-only leases on directories and NFS-specific lease-breaking semantics.

We implemented a /proc interface on the server to enable or disable directory delegation at run time. At startup, the client queries the server for directory delegation support.

The server has hooks for a policy layer to control the granting of directory delegations. (No policy is implemented yet.) When and whether to acquire delegations is also a client concern.

Testing

We are testing delegation grant and recall in a test rig with one or two clients. Testing consists mostly of comparing NFS operation-counts when directory delegations is enabled or disabled.

Tests range from simple UNIX utilities — ls, find, touch — to hosting a CVS repository or compiling with shared libraries and header files on NFS servers. Tests will become more specific.

We have extended PyNFS to support directory delegations. So far, the support is basic and the tests are trivial. Tests will become more specific.

We are designing mechanisms that allow simulation experiments to compare delegation policies on NFSv4 network traces.

Task 5. How do you specify/measure NFS Server load.

To frame the task, consider identical symmetric servers with a cluster file system back end and a task running on one of them. Can we compare the load on the servers to determine whether there would be a benefit to migrating a client from one to the other?

Answering this question requires that we define a model of load based on measurable quanta.

Given a model, the next step is to write a tool that collects the factors that influence load and to measure how well the model accurately predicts performance.

Goals

If an application is running at less than peak performance, the load model should tell us whether the bottleneck is in the server, the client, or elsewhere.

If the bottleneck is in the server, one option for improving application performance is replacing server components with faster ones. Another option is to add servers. A third option is to migrate the application to a lightly-loaded server.

* Actually, the second option is fruitless without the third.

Factors that influence server load

Disks

The rate at which a single file in a server file system can be depends on many factors, including characteristics of the disk hardware (rotation speed, access latency, etc.), the disk controller, the bus, the layout of files on the disk, the size of the transfer, and the degree of caching. The overall bandwidth of a file system also depends on the degree of striping and distribution of requests across disks.

The iostat command can reveal a bottleneck due to server disks if seek or transfer rates approach maximum values. For a given server configuration, these values can be measured directly. It might be possible to predict these values for a given hardware ensemble.

CPU

Server threads compete with one another and with the operating system for access to the CPU. Excess offered load can exhaust the availability of server threads.

* how would we know if this were to happen?
* would it suffice to simply allocate more threads?
* or are there pathological cases to consider?

Overall CPU utilization can be measured, also with iostat, but there may be other factors influencing the allocation of CPU to server threads. For example, excessive pressure on the memory or interrupt subsystem can force the operating system to intervene.

Interrupts

Interrupt rates can be measured with

* i forget :-(

For a given hardware configuration, a threshold can be measured experimentally.

Memory

The memory subsystem is complex and varies among operating systems. Applications compete with one another for virtual memory. Often, they also compete with the file system, which uses the virtual memory subsystem for its in-memory cache.

Often, excess demand for memory is reflected by early eviction of pages in virtual memory. The vmstat command shows the pageout rate, which does not measure early eviction, but does reflect overall memory pressure.

Network

Network utilization is the ratio of delivered bandwidth to maximum available bandwidth. Maximum available bandwidth is a property of network hardware. Delivered bandwidth can be measured with the netstat command.

Full-duplex network technologies can deliver maximal bandwidth in both directions, while half-duplex network technologies are limited to delivering the sum of the two directions.

* i believe that ius a true statement ...

Measuring load

Each measured value can be expressed as a ratio between 0 (idle) and 1 (at capacity). For each value, there is a program that consumes the corresponding resource.

The overall performance of a server can be tested by measuring NFS performance directly with microbenchmarks. Candidate microbenchmarks include NULL RPC, and small READ RPC, large READ RPC, small WRITE RPC, and large WRITE RPC.

The usefulness of a measured value can be tested by comparing microbenchmark performance as the resource is consumed.

It is useful to sample the instantaneous values, and to track them over time with a damping function that shows the averages over the last second, minute, five minutes, etc.

How do we check usefulness of this information?

boot with reduced resources somehow, see if increasing resources increases performance as predicted?

Disk bandwidth

vary size of raid arrays, bandwidth of disk interfaces?

Or run another process that soaks up some percentage of bandwidth??

CPU load

CPU throttling??

Just try different totally random machines? Vary workload? How do we get a light vs. heavy workload?

How do we measure performance of each? Increasing clients until we see performance degredation due to server bottlenecks would be obvious thing to do....)

Measures of load

what do we use to determine if our measure of load is correct?

  • single rpc latency measured from a client?
  • time to complete some other task, measured from a single client (not actually involved in loading the server)?
  • rpc's per second?

Configuration parameters on server that can be varied

  • number of server threads
  • number of connections per server thread
  • request queue lengths (# of bytes waiting in tcp socket)

Some special situations that can be problems (from Chuck)

  • reboot recovery: everyone is recovering at once.
  • mount storms: a lab full of clients may all mount at once, or a cluster job may trigger automount from all clients at once.

Possible benchmark sources, for this and locking scalability

postmark

looks pretty primitive: mixture of reads, writes, creates, unlinks. No locks.

filebench

also no locking. Haven't figured out exactly what the various loads do. Is there actually an active developer community?

See Bull.net's list?

  • Bonnie++
  • FStress
  • dbench: simulates filesystem activity created by a samba server running the proprietary SMB benchmark "netbench". Maybe not so useful.
  • Do-it-ourselves modify postmark or filebench? set up a mailserver (e.g.), send it fake mail. get traces from working servers
Personal tools