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

Colin Patrick McCabe updated HDFS-5276:
---------------------------------------

    Attachment: HDFS-5276.001.patch

Here's a patch which implements thread-local counters in 
{{FileSystem#Statistics}}.  When incrementing, no locks need to be taken-- each 
thread simply increments its thread local value.  The read operations sum up 
the thread-local data.

Note that it is not necessary to use {{AtomicLong}}.  We only need 
{{volatile}}.  This is because we only ever have one thread updating the 
thread-local statistics.  So there is no "lost updates" problem and no need for 
{{CAS}} or {{LOCK}], etc.  We only need a read barrier, which is provided by 
{{volatile}}.

Give this a try and see if it addresses the performance problem.  I think this 
should perform well in non-massively-multithreaded settings as well.

> FileSystem.Statistics got performance issue on multi-thread read/write.
> -----------------------------------------------------------------------
>
>                 Key: HDFS-5276
>                 URL: https://issues.apache.org/jira/browse/HDFS-5276
>             Project: Hadoop HDFS
>          Issue Type: Bug
>    Affects Versions: 2.0.4-alpha
>            Reporter: Chengxiang Li
>            Assignee: Colin Patrick McCabe
>         Attachments: DisableFSReadWriteBytesStat.patch, HDFS-5276.001.patch, 
> HDFSStatisticTest.java, hdfs-test.PNG, jstack-trace.PNG, ThreadLocalStat.patch
>
>
> FileSystem.Statistics is a singleton variable for each FS scheme, each 
> read/write on HDFS would lead to a AutomicLong.getAndAdd(). AutomicLong does 
> not perform well in multi-threads(let's say more than 30 threads). so it may 
> cause  serious performance issue. during our spark test profile, 32 threads 
> read data from HDFS, about 70% cpu time is spent on 
> FileSystem.Statistics.incrementBytesRead().



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

Reply via email to