[jira] [Updated] (HBASE-6968) Several HBase write perf improvement
[ https://issues.apache.org/jira/browse/HBASE-6968?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] stack updated HBASE-6968: - Affects Version/s: 0.90.6 0.92.2 0.94.2 Several HBase write perf improvement Key: HBASE-6968 URL: https://issues.apache.org/jira/browse/HBASE-6968 Project: HBase Issue Type: Improvement Affects Versions: 0.90.6, 0.92.2, 0.94.2 Reporter: Liyin Tang Here are 2 hbase write performance improvements recently: 1) Avoid creating HBaseConfiguraiton object for each HLog. Every time when creating a HBaseConfiguraiton object, it would parse the xml configuration files from disk, which is not cheap operation. In HLog.java: orig: {code:title=HLog.java} newWriter = createWriter(fs, newPath, HBaseConfiguration.create(conf)); {code} new: {code} newWriter = createWriter(fs, newPath, conf); {code} 2) Change 2 hotspot synchronized functions into double locking pattern. So it shall remove the synchronization overhead in the normal case. orig: {code:title=HBaseRpcMetrics.java} public synchronized void inc(String name, int amt) { MetricsTimeVaryingRate m = get(name); if (m == null) { m = create(name); } m.inc(amt); } {code} new: {code} public void inc(String name, int amt) { MetricsTimeVaryingRate m = get(name); if (m == null) { synchronized (this) { if ((m = get(name)) == null) { m = create(name); } } } m.inc(amt); } {code} = orig: {code:title=MemStoreFlusher.java} public synchronized void reclaimMemStoreMemory() { if (this.server.getGlobalMemstoreSize().get() = globalMemStoreLimit) { flushSomeRegions(); } } {code} new: {code} public void reclaimMemStoreMemory() { if (this.server.getGlobalMemstoreSize().get() = globalMemStoreLimit) { flushSomeRegions(); } } private synchronized void flushSomeRegions() { if (this.server.getGlobalMemstoreSize().get() globalMemStoreLimit) { return; // double check the global memstore size inside of the synchronized block. } ... } {code} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira
[jira] [Updated] (HBASE-6968) Several HBase write perf improvement
[ https://issues.apache.org/jira/browse/HBASE-6968?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Liyin Tang updated HBASE-6968: -- Description: Here are 2 hbase write performance improvements recently found out. 1) Avoid creating HBaseConfiguraiton object for each HLog. Every time when creating a HBaseConfiguraiton object, it would parse the xml configuration files from disk, which is not cheap operation. In HLog.java: orig: {code:title=HLog.java} newWriter = createWriter(fs, newPath, HBaseConfiguration.create(conf)); {code} new: {code} newWriter = createWriter(fs, newPath, conf); {code} 2) Change 2 hotspot synchronized functions into double locking pattern. So it shall remove the synchronization overhead in the normal case. orig: {code:title=HBaseRpcMetrics.java} public synchronized void inc(String name, int amt) { MetricsTimeVaryingRate m = get(name); if (m == null) { m = create(name); } m.inc(amt); } {code} new: {code} public void inc(String name, int amt) { MetricsTimeVaryingRate m = get(name); if (m == null) { synchronized (this) { if ((m = get(name)) == null) { m = create(name); } } } m.inc(amt); } {code} = orig: {code:title=MemStoreFlusher.java} public synchronized void reclaimMemStoreMemory() { if (this.server.getGlobalMemstoreSize().get() = globalMemStoreLimit) { flushSomeRegions(); } } {code} new: {code} public void reclaimMemStoreMemory() { if (this.server.getGlobalMemstoreSize().get() = globalMemStoreLimit) { flushSomeRegions(); } } private synchronized void flushSomeRegions() { if (this.server.getGlobalMemstoreSize().get() globalMemStoreLimit) { return; // double check the global memstore size inside of the synchronized block. } ... } {code} was: There are two improvements in this jira: 1) Change 2 hotspot synchronized functions into double locking pattern. So it shall remove the synchronization overhead in the normal case. 2) Avoid creating HBaseConfiguraiton object for each HLog. Every time when creating a HBaseConfiguraiton object, it would parse the xml configuration files from disk, which is not cheap operation. Several HBase write perf improvement Key: HBASE-6968 URL: https://issues.apache.org/jira/browse/HBASE-6968 Project: HBase Issue Type: Improvement Reporter: Liyin Tang Here are 2 hbase write performance improvements recently found out. 1) Avoid creating HBaseConfiguraiton object for each HLog. Every time when creating a HBaseConfiguraiton object, it would parse the xml configuration files from disk, which is not cheap operation. In HLog.java: orig: {code:title=HLog.java} newWriter = createWriter(fs, newPath, HBaseConfiguration.create(conf)); {code} new: {code} newWriter = createWriter(fs, newPath, conf); {code} 2) Change 2 hotspot synchronized functions into double locking pattern. So it shall remove the synchronization overhead in the normal case. orig: {code:title=HBaseRpcMetrics.java} public synchronized void inc(String name, int amt) { MetricsTimeVaryingRate m = get(name); if (m == null) { m = create(name); } m.inc(amt); } {code} new: {code} public void inc(String name, int amt) { MetricsTimeVaryingRate m = get(name); if (m == null) { synchronized (this) { if ((m = get(name)) == null) { m = create(name); } } } m.inc(amt); } {code} = orig: {code:title=MemStoreFlusher.java} public synchronized void reclaimMemStoreMemory() { if (this.server.getGlobalMemstoreSize().get() = globalMemStoreLimit) { flushSomeRegions(); } } {code} new: {code} public void reclaimMemStoreMemory() { if (this.server.getGlobalMemstoreSize().get() = globalMemStoreLimit) { flushSomeRegions(); } } private synchronized void flushSomeRegions() { if (this.server.getGlobalMemstoreSize().get() globalMemStoreLimit) { return; // double check the global memstore size inside of the synchronized block. } ... } {code} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira
[jira] [Updated] (HBASE-6968) Several HBase write perf improvement
[ https://issues.apache.org/jira/browse/HBASE-6968?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Liyin Tang updated HBASE-6968: -- Description: Here are 2 hbase write performance improvements recently: 1) Avoid creating HBaseConfiguraiton object for each HLog. Every time when creating a HBaseConfiguraiton object, it would parse the xml configuration files from disk, which is not cheap operation. In HLog.java: orig: {code:title=HLog.java} newWriter = createWriter(fs, newPath, HBaseConfiguration.create(conf)); {code} new: {code} newWriter = createWriter(fs, newPath, conf); {code} 2) Change 2 hotspot synchronized functions into double locking pattern. So it shall remove the synchronization overhead in the normal case. orig: {code:title=HBaseRpcMetrics.java} public synchronized void inc(String name, int amt) { MetricsTimeVaryingRate m = get(name); if (m == null) { m = create(name); } m.inc(amt); } {code} new: {code} public void inc(String name, int amt) { MetricsTimeVaryingRate m = get(name); if (m == null) { synchronized (this) { if ((m = get(name)) == null) { m = create(name); } } } m.inc(amt); } {code} = orig: {code:title=MemStoreFlusher.java} public synchronized void reclaimMemStoreMemory() { if (this.server.getGlobalMemstoreSize().get() = globalMemStoreLimit) { flushSomeRegions(); } } {code} new: {code} public void reclaimMemStoreMemory() { if (this.server.getGlobalMemstoreSize().get() = globalMemStoreLimit) { flushSomeRegions(); } } private synchronized void flushSomeRegions() { if (this.server.getGlobalMemstoreSize().get() globalMemStoreLimit) { return; // double check the global memstore size inside of the synchronized block. } ... } {code} was: Here are 2 hbase write performance improvements recently found out. 1) Avoid creating HBaseConfiguraiton object for each HLog. Every time when creating a HBaseConfiguraiton object, it would parse the xml configuration files from disk, which is not cheap operation. In HLog.java: orig: {code:title=HLog.java} newWriter = createWriter(fs, newPath, HBaseConfiguration.create(conf)); {code} new: {code} newWriter = createWriter(fs, newPath, conf); {code} 2) Change 2 hotspot synchronized functions into double locking pattern. So it shall remove the synchronization overhead in the normal case. orig: {code:title=HBaseRpcMetrics.java} public synchronized void inc(String name, int amt) { MetricsTimeVaryingRate m = get(name); if (m == null) { m = create(name); } m.inc(amt); } {code} new: {code} public void inc(String name, int amt) { MetricsTimeVaryingRate m = get(name); if (m == null) { synchronized (this) { if ((m = get(name)) == null) { m = create(name); } } } m.inc(amt); } {code} = orig: {code:title=MemStoreFlusher.java} public synchronized void reclaimMemStoreMemory() { if (this.server.getGlobalMemstoreSize().get() = globalMemStoreLimit) { flushSomeRegions(); } } {code} new: {code} public void reclaimMemStoreMemory() { if (this.server.getGlobalMemstoreSize().get() = globalMemStoreLimit) { flushSomeRegions(); } } private synchronized void flushSomeRegions() { if (this.server.getGlobalMemstoreSize().get() globalMemStoreLimit) { return; // double check the global memstore size inside of the synchronized block. } ... } {code} Several HBase write perf improvement Key: HBASE-6968 URL: https://issues.apache.org/jira/browse/HBASE-6968 Project: HBase Issue Type: Improvement Reporter: Liyin Tang Here are 2 hbase write performance improvements recently: 1) Avoid creating HBaseConfiguraiton object for each HLog. Every time when creating a HBaseConfiguraiton object, it would parse the xml configuration files from disk, which is not cheap operation. In HLog.java: orig: {code:title=HLog.java} newWriter = createWriter(fs, newPath, HBaseConfiguration.create(conf)); {code} new: {code} newWriter = createWriter(fs, newPath, conf); {code} 2) Change 2 hotspot synchronized functions into double locking pattern. So it shall remove the synchronization overhead in the normal case. orig: {code:title=HBaseRpcMetrics.java} public synchronized void inc(String name, int amt) { MetricsTimeVaryingRate m = get(name); if (m == null) { m = create(name); }