[ 
https://issues.apache.org/jira/browse/HADOOP-10048?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jason Lowe updated HADOOP-10048:
--------------------------------

    Attachment: HADOOP-10048.patch

Here's a patch that uses a lockless approach to the problem.  The variables 
that were being synchronized were treated read-only, except for the 
dirNumLastAccessed field.  Therefore the patch wraps the relevant variables in 
a context object and when the conf is updated the context reference is 
atomically swapped out for a new context object.  Each method needing to access 
the context makes a local copy of the reference and always uses the context 
through that local reference, so they are always looking at a self-consistent 
context.  The tradeoff is that the context itself may be stale, but it should 
always be self-consistent.  The dirNumLastAccessed field is treated in a 
similar fashion.  It is read once into a local variable then the local variable 
is used for iteration purposes.

Since this is primarily a performance optimization the patch also changes the 
local directories to be stored as Path objects rather than Strings so we don't 
need to create so many Paths from scratch during methods.

Ran some performance numbers on multithreaded accesses with this change and was 
a bit surprised to see it was significantly slower than the old version.  
However that's because the change in HADOOP-9652 causes fs.exists() to 
fork-and-exec the stat command, and before this change that was done serially 
across threads.  With this change it effectively becomes a mini fork-bomb, 
forking stat in parallel like crazy.  When I reverted the HADOOP-9652 change 
locally, the patched version was about 2.5x faster than the original version 
with 8 threads across 12 local directories.

The speedup is nice, but I'm not sure this needs to be a Blocker for the 2.3.0 
release.  If the filesystem is the real bottleneck (e.g.: accessing one of the 
drives is always really, really slow or using fork-and-exec stat to do an 
fs.exists) then this change will only marginally help in most use cases.  
Eventually all of the serving threads are going to be hung up waiting for the 
filesystem which is only a bit better (or sometimes worse as in the 
fork-and-exec case) than waiting serially.  The real throughput of a serve 
using the allocator may not be significantly improved.

> LocalDirAllocator should avoid holding locks while accessing the filesystem
> ---------------------------------------------------------------------------
>
>                 Key: HADOOP-10048
>                 URL: https://issues.apache.org/jira/browse/HADOOP-10048
>             Project: Hadoop Common
>          Issue Type: Improvement
>    Affects Versions: 2.3.0
>            Reporter: Jason Lowe
>            Priority: Blocker
>         Attachments: HADOOP-10048.patch
>
>
> As noted in MAPREDUCE-5584 and HADOOP-7016, LocalDirAllocator can be a 
> bottleneck for multithreaded setups like the ShuffleHandler.  We should 
> consider moving to a lockless design or minimizing the critical sections to a 
> very small amount of time that does not involve I/O operations.



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to