<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/wordpress-mu-1.2.5" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>procself &#187; performance</title>
	<link>http://blogs.fe.up.pt/mpadilha</link>
	<description>cat /proc/self/cmdline</description>
	<pubDate>Wed, 14 Oct 2009 17:36:32 +0000</pubDate>
	<generator>http://wordpress.org/?v=wordpress-mu-1.2.5</generator>
	<language>en</language>
			<item>
		<title>Http vs Sftp</title>
		<link>http://blogs.fe.up.pt/mpadilha/2009/06/20/http-vs-sftp/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2009/06/20/http-vs-sftp/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 12:22:47 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[performance]]></category>

		<category><![CDATA[networking]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2009/06/20/http-vs-sftp/</guid>
		<description><![CDATA[Upload do mesmo ficheiro binário não-comprimível, primeiro por HTTP e depois por SFTP.

&#8230; como diria alguém conhecido, é por isso que &#8220;uma coisa é uma coisa e outra coisa é outra coisa&#8221;.
Partilhar
]]></description>
			<content:encoded><![CDATA[<p>Upload do mesmo ficheiro binário não-comprimível, primeiro por HTTP e depois por SFTP.</p>
<p><img src="http://blogs.fe.up.pt/mpadilha/files/2009/06/http_vs_sftp.PNG" alt="HTTP vs SFTP" /></p>
<p>&#8230; como diria alguém conhecido, é por isso que &#8220;uma coisa é uma coisa e outra coisa é outra coisa&#8221;.</p>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=108&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_108" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2009/06/20/http-vs-sftp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Thread-safe singleton?</title>
		<link>http://blogs.fe.up.pt/mpadilha/2009/03/11/thread-safe-singleton/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2009/03/11/thread-safe-singleton/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 12:18:46 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[performance]]></category>

		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2009/03/11/thread-safe-singleton/</guid>
		<description><![CDATA[Uma das piores coisas que se pode encontrar quando se pretende migrar uma aplicação single-threaded para multi-threaded é um Singleton que nunca o deveria ter sido, um daqueles que guarda informação de estado por todo o lado e que é usado em múltiplos sítios da aplicação ao longo de todo o ciclo de vida.
O que [...]]]></description>
			<content:encoded><![CDATA[<p>Uma das piores coisas que se pode encontrar quando se pretende migrar uma aplicação single-threaded para multi-threaded é um Singleton que nunca o deveria ter sido, um daqueles que guarda informação de estado por todo o lado e que é usado em múltiplos sítios da aplicação ao longo de todo o ciclo de vida.</p>
<p>O que é se faz a uma coisa destas? A solução parece óbvia: &#8220;alteras o método instance() para devolver sempre um objecto novo&#8221;, efectivamente desfazendo o comportamento de singleton. Ok, funciona, mas e se o impacto em termos de performance for demasiado elevado? O que fazer quando se pretende manter o comportamento de singleton, mas ao nível do Thread, em vez de ser ao nível da JVM?</p>
<p>A resposta é substituir as variáveis existentes que guardam informação de estado por outras do tipo <a href="http://java.sun.com/javase/6/docs/api/java/lang/ThreadLocal.html">ThreadLocal&lt;T&gt;</a>.</p>
<blockquote><p>This class provides thread-local variables.  These variables differ from  their normal counterparts in that each thread that accesses one (via its  <tt>get</tt> or <tt>set</tt> method) has its own, independently initialized  copy of the variable.  <tt>ThreadLocal</tt> instances are typically private  static fields in classes that wish to associate state with a thread (e.g.,  a user ID or Transaction ID).</p></blockquote>
<p>Ok, perfeito, não é?</p>
<p>Hmm&#8230; quase. Funciona bem se a criação dos threads for feita exclusivamente &#8220;antes&#8221; da primeira utilização da classe. Dessa forma cada thread inicializa a sua própria cópia uma só vez e trabalha com ela daí para a frente.</p>
<p>Mas e se forem necessários vários níveis de multi-threading, alguns dos quais &#8220;depois&#8221; da primeira utilização da classe? De acordo com a forma de funcionamento das variáveis ThreadLocal, cada thread filho teria uma instância nova, o que pode corresponder a esforço desnecessário e, dependendo dos casos, ter um impacto significativo no desempenho.</p>
<p>O nome diz tudo:  <a href="http://java.sun.com/javase/6/docs/api/java/lang/InheritableThreadLocal.html">InheritableThreadLocal&lt;T&gt;</a> é uma subclasse de ThreadLocal&lt;T&gt; que permite herdar a instância do thread pai se ela existir.</p>
<blockquote><p> This class extends <tt>ThreadLocal</tt> to provide inheritance of values  from parent thread to child thread: when a child thread is created, the  child receives initial values for all inheritable thread-local variables  for which the parent has values.  Normally the child&#8217;s values will be  identical to the parent&#8217;s; however, the child&#8217;s value can be made an  arbitrary function of the parent&#8217;s by overriding the <tt>childValue</tt>  method in this class.</p></blockquote>
<p>Agora sim, perfeito. <img src='http://blogs.fe.up.pt/mpadilha/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=99&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_99" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2009/03/11/thread-safe-singleton/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JDBC e Reverse DNS Lookups</title>
		<link>http://blogs.fe.up.pt/mpadilha/2009/03/09/jdbc-e-reverse-dns-lookups/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2009/03/09/jdbc-e-reverse-dns-lookups/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 18:53:42 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[performance]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[windows]]></category>

		<category><![CDATA[networking]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2009/03/09/jdbc-e-reverse-dns-lookups/</guid>
		<description><![CDATA[Se alguma vez ouvirem alguém queixar-se que uma aplicação Java client/server que funciona exclusivamente em rede local fica extraordinariamente lenta cada vez que o acesso à Internet cai, lembrem-se deste post.
Com uma descrição destas a primeira coisa que me ocorre é DNS. Como a aplicação não deixa de funcionar, fica simplesmente mais lenta, provavelmente o [...]]]></description>
			<content:encoded><![CDATA[<p>Se alguma vez ouvirem alguém queixar-se que uma aplicação Java client/server que funciona exclusivamente em rede local fica extraordinariamente lenta cada vez que o acesso à Internet cai, lembrem-se deste post.</p>
<p>Com uma descrição destas a primeira coisa que me ocorre é DNS. Como a aplicação não deixa de funcionar, fica simplesmente mais lenta, provavelmente o problema estará numa resolução inversa de DNS, que são frequentemente feitas pelas aplicações / middleware apenas para efeitos de logging.</p>
<p>Para não restarem dúvidas que o problema se relacionava com DNS, o servidor em causa tinha a configuração de DNS a apontar para o servidores do ISP, que obviamente ficam inacessíveis cada vez que se perde o acesso à Internet.</p>
<p>Comecei por procurar na aplicação, mas não encontrei nada que justificasse um lookup inverso de DNS. No tomcat encontrei um parâmetro que parecia promissor:</p>
<blockquote><p><code>enableLookups - Set to true if you want calls to request.getRemoteHost() to perform DNS lookups in order to return the actual host name of the remote client. Set to false to skip the DNS lookup and return the IP address in String form instead (thereby improving performance). By default, DNS lookups are enabled.</code></p></blockquote>
<p>Mas mesmo depois de desactivar o problema persistia. Descendo ainda mais na stack aplicacional descobri este <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5092063">bug</a> no Java, já antiguinho, mas ainda aplicável à versão que estava a ser usada:</p>
<blockquote><p><code>There is a call to InetSocketAddress.getHostName() in the ProxySelector code. This will trigger a reverse lookup when the hostname is not already known. If DNS is not configured correctly on the machine, this will generate a long timeout.</code></p></blockquote>
<p>Foi este <a href="http://archives.postgresql.org/pgsql-jdbc/2005-09/msg00094.php">post</a> na mailling list do Postgres que me conduziu ao bug em si e a descrição que fazem do problema é mais fácil de entender (e mais assustadora):</p>
<blockquote><p><code>I can confirm that this is an issue in JDK 1.5 (a/k/a Java5) in Windows.  This is not the fault of postgres, but like others have suggested, it is with reverse DNS lookup.  It affects all TCP connections.<br />
If you connect to an IP address it attempts to look up the name, resulting in these delays.</code></p></blockquote>
<p>Se actualizar a versão de Java não for uma hipótese viável (como não era no meu caso), e se a resolução inversa ocorrer sempre para o mesmo endereço IP ou conjunto restrito de endereços, a solução pode ser mesmo adicioná-los ao ficheiro de hosts (C:\windows\system32\drivers\etc\hosts ou /etc/hosts).</p>
<p>Pelo caminho ainda descobri uma forma fácil de ver o conteúdo da cache de DNS num sistema windows:</p>
<blockquote><p><code>ipconfig /displaydns</code></p></blockquote>
<p>Se ficaram curiosos sobre como fazer a mesma coisa em Linux, a resposta não é fácil. Sem software adicional o kernel Linux não inclui uma cache de DNS, cada pedido é um pedido. Existe o <a href="http://linux.die.net/man/8/nscd">nscd</a> (Name Server Cache Daemon) que é bastante comum mas não vem pré-instalado em todas as distribuições (por exemplo não vinha no último Debian que instalei).</p>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=100&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_100" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2009/03/09/jdbc-e-reverse-dns-lookups/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java Profilling - TPTP</title>
		<link>http://blogs.fe.up.pt/mpadilha/2008/09/03/java-profilling-tptp/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2008/09/03/java-profilling-tptp/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 16:45:09 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[performance]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[open-source]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2008/09/03/java-profilling-tptp/</guid>
		<description><![CDATA[Cada vez mais me convenço que, logo a seguir a um debugger, uma ferramenta de profiling é das mais importantes para quem desenvolve software.A minha mais recente descoberta é precisamente um profiler para aplicações Java desenvolvidas em (e/ou para) Eclipse. Chama-se TPTP, que é acrónimo para Testing and Performance Tools Platform, e foi um bocadinho difícil de pôr [...]]]></description>
			<content:encoded><![CDATA[<p>Cada vez mais me convenço que, logo a seguir a um debugger, uma ferramenta de <a href="http://en.wikipedia.org/wiki/Performance_analysis">profiling</a> é das mais importantes para quem desenvolve software.A minha mais recente descoberta é precisamente um <span class="Apple-style-span">profiler</span> para aplicações Java desenvolvidas em (e/ou para) Eclipse. Chama-se <a href="http://www.eclipse.org/articles/Article-TPTP-Profiling-Tool/tptpProfilingArticle.html">TPTP</a>, que é acrónimo para Testing and Performance Tools Platform, e foi um bocadinho difícil de pôr a funcionar em Vista por causa do <a href="http://technet.microsoft.com/en-us/library/cc709691.aspx">UAC</a>, mas valeu bem o esforço.Esta ferramenta permite analisar com muito detalhe a utilização de CPU. Dá para fazer <span class="Apple-style-span">drill-down</span> por package, classe e método; ver tempos gastos em cada nível da <span class="Apple-style-span">call stack</span>, ou acumulados daí para baixo; e até desenhar gráficos de chamadas e dependências (que me parecem pouco úteis para projectos já com alguma dimensão, mas enfim).Não explorei muito as capacidades de <span class="Apple-style-span">Memory Analysis</span>, porque não era o mais relevante para o projecto em causa, mas também estão lá. Só a <span class="Apple-style-span">performance</span> de rede é que não está contemplada nesta plataforma, mas para isso existem o <a href="http://jakarta.apache.org/jmeter/">JMeter</a> (se for HTTP) e o <a href="http://www.wireshark.org/">Wireshark</a> (em todos os outros casos), que fazem muito bem o seu trabalho. </p>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=92&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_92" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2008/09/03/java-profilling-tptp/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
