[ 
https://issues.apache.org/jira/browse/MAPREDUCE-5791?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13933916#comment-13933916
 ] 

Chris Nauroth commented on MAPREDUCE-5791:
------------------------------------------

I think I found the root cause of the problem.  The JDK does not really 
implement a zero-copy transfer on Windows.  I checked the source code for 
OpenJDK 6, 7 and 8, and they all look like this in FileChannelImpl.c:

{code}
JNIEXPORT jlong JNICALL
Java_sun_nio_ch_FileChannelImpl_transferTo0(JNIEnv *env, jobject this,
                                            jint srcFD,
                                            jlong position, jlong count,
                                            jint dstFD)
{
    return IOS_UNSUPPORTED;
}
{code}

On Linux, these functions delegate to the {{sendfile}} syscall.  It's a shame 
that this isn't available in the Windows JDK, because it's theoretically 
possible to do a zero-copy transfer on Windows using {{TransmitFile}}:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms740565(v=vs.85).aspx

I think it's fine to proceed with this buffer-copying patch, but I also wonder 
if we'd see even better performance if we could figure out a JNI call to 
{{TransmitFile}}.

I'll review the patch in more detail later.  From a quick glance, it looked 
like there were a few cases of indentation using 4 spaces instead of 2 spaces 
(the project standard).

> Shuffle phase is slow in Windows - FadviseFileRegion::transferTo does not 
> read disks efficiently
> ------------------------------------------------------------------------------------------------
>
>                 Key: MAPREDUCE-5791
>                 URL: https://issues.apache.org/jira/browse/MAPREDUCE-5791
>             Project: Hadoop Map/Reduce
>          Issue Type: Bug
>            Reporter: Nikola Vujic
>            Assignee: Nikola Vujic
>         Attachments: MAPREDUCE-5791.patch
>
>
> transferTo method in org.apache.hadoop.mapred.FadvisedFileRegion is using 
> transferTo method from a FileChannel to transfer data from a disk to socket. 
> This is performing slow in Windows, slower than in Linux. The reason is that 
> transferTo method for the java.nio is issuing 32K IO requests all the time. 
> In Windows, these 32K transfers are not optimal and we don't get the best 
> performance form the underlying IO subsystem. In order to achieve better 
> performance when reading from the drives, we need to read data in bigger 
> chunks, 512K for example.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to