Linux e Windows Server, ainda em dúvidas?

Faz anos que a Microsoft namora o Linux, e no ano passado o improvável aconteceu, ela se juntou a Linux Foundation (TLF), mostrando claramente que não ia adiantar muito tentar recuperar o mercado de servidores, atualmente dominado pelo Linux. Azure Runs Linux e Microsoft at Linux Foundation

Então a Microsoft tem seu próprio Linux (Azure Cloud Switch), voltado para o controle e hosting de servidores Windows em sua Nuvem Azure; aqui pra bom entendedor fica uma dica da própria, de que quando a coisa é pra valer, ela se valeu do Linux e, percebendo melhor o futuro, juntou-se à LF. Microsoft desenvolve seu próprio Linux

Muito provável que um leitor desatento ou eufórico vá encontrar dezenas de milhares de artigos, colocando o Windows dominando quase 100% desse mercado de servidores. Mas, tem um porém: como entrar em cada empresa e ver o que se está usando? O mais garantido seria vasculhar os mais de dez milhões de top servers na Internet toda, e que respondem que SO usam. Parece haver um consenso nessa metrificação, dizer o quanto cada um domina no market share pelo exposto na web. Se você pegar um relatório da SpiceWorks, verá um mercado de servidores de 10% Linux e 87% usam Windows Server. Nesse ponto até existe uma ótica que tem lógica, mas não se sustenta: bastam 10% de Linux pra fazer os 90% do Windows. A medição foi feita pelos números de downloads. Na metrificação por survey da W3Techs aparece um resultado totalmente diferente, 65% Linux contra 34% Windows.

O mais estranho nisso tudo, é que nem se discute o que seria mais sensato, como as habilidades do SO. E mais, é inquestionável a superioridade do Linux no que tange a ser um SO voltado para um processamento de alto desempenho, robustez, escalabilidade, multi processamento paralelo distribuído, mais com menos, etc. Difícil é ouvir algo do tipo: “mas eu não tenho gente qualificada em Linux”… nesse momento a luta acabou, jogaram a toalha! Sentimentalismo é coisa que enfraquece a razão.

O Windows foi a melhor coisa que aconteceu no mundo da computação pessoal, inquestionável a contribuição dela na Tecnologia da Informação no passado, no presente e, agora com Linux, no futuro. Mas isso não significa dizer que ela é melhor que um MacOS “casadinho” com o hardware proprietário da Apple, para a computação pessoal, mas o custo quase zero das versões desktops da Microsoft e a vantagem adicional de que não existe concorrente, a tornam ainda imbatível nesse mercado; conheça o Windows primeiro se pretende usar um Mac, você não voltará por livre e espontânea vontade a usar Windows. Fato!

Mais de 70% das empresas estão com seus servidores virtualizados e, nesse nicho o VMWare massacra. E vamos andando, e há coisas que não se pode mais parar, como ir para a Nuvem, que oferecem um ferramental nunca visto para administração de servidores, e como a sustentação para tanta tecnologia vem da comunidade, fica evidente a escolha por SOs que tenham: Confiabilidade, escalabilidade, robustez, alto desempenho e todo um arsenal para suportar infra estrutura, seja no “staging” ou “production“. A resistência não deve estar em usar Linux, que pode conviver tranquilamente com um ambiente Windows, aliás Linux é mesmo o “backend“, deixando a plataforma de desenvolvimento em Windows (bom mesmo seria MacOS!). O SqlServer já foi pra Linux!

According to IDC [1], 47.9% of the servers worldwide ran Windows Server whereas 40.5% ran Linux. W3Techs [2] ran a survey this month, which checked the top 1 million Web servers (according to Alexa) and 64.9% of them were running Unix/Unix-like operating systems, 35.2% were running Windows and less than 0.1% were running Mac.

Então, se olharmos para outras coisas como o aumento do uso e hegemonia de determinadas linguagens de programação, iremos ver Java e JavaScript (e Python!) como líderes e, veremos que as empresas adotaram e adotam Java, tradicionalmente mundo Linux. Não há o que discutir, atualmente e no futuro, Linux ou suas vertentes dominarão esse mercado, assim como Windows continuará a dominar o Desktop. E quem irá fazer isso serão os grandes players de Nuvem, já que aqui por baixo ainda carecem de coragem e conhecimento de Sistemas Operacionais. Mesmo o Windows sendo superior na Nuvem, por baixo tem Linux como hosting.

Mas não só o SO importa tanto, já que uma linguagem precisa ser usada para que a mágica aconteça. O que se observa historicamente é que até um dado momento, o Java estava muito forte nos ambientes acadêmicos, no mundo open source, e entranhado fortemente no governo (quem nunca usou o IRPF da Receita Federal, por exemplo). Antes da abertura do código do .Net, o Java foi fortemente “patrocinado” por algumas das gigantes de tecnologia (IBM, Sun, Oracle e HP) como forma de combater a hegemonia e dependência da Microsoft. A Microsoft por sua vez corria por fora, e era a preferência das empresas produtoras de software “pacote” e desenvolvedores iniciantes, pela maior facilidade de acesso à material oficial e suporte.

Enquanto isso, no emergente ambiente de aplicações móveis, ou mobile, em termos de aplicações nativas, a Microsoft “dormiu no ponto” durante décadas com o arcaico “Windows CE”, e o .Net ainda hoje só acha espaço no Windows Phone, já que o Android essencialmente se utiliza do Java, e no mundo iOS da Apple a linguagem é o Objective-C. Então se formos falar de SOs, e Android é Linux (fork), então já está sanada a dúvida.

É inegável que tanto o Java quanto .Net estão maduros e são performáticos (se bem implementados), e tem promessas de continuidade e de evolução. Mas não existem estatísticas confiáveis e nem consenso sobre qual é o mais utilizado globalmente, dado a grande variedade de cenários de uso e soluções existentes. Dependendo do custo complexidade, tamanho, orçamento e prazo disponível para implantar uma solução, você perceberá que a escolha não é óbvia.

 

How do you add swap to an EC2 instance?

When running an ec2 micro instance and you’ve been finding that the instance occasionally runs out of memory,  then you fix this problem adding swap or paging space to the instance.

Paging works by creating an area on your hard drive and using it for extra memory, this memory is much slower than normal memory, however much more of it is available.

To add this extra space to your instance you type:

sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo /sbin/mkswap /var/swap.1
sudo chmod 600 /var/swap.1
sudo /sbin/swapon /var/swap.1

If you need more than 1024 then change that to something higher.

To enable it by default after reboot, add this line to /etc/fstab:

swap        /var/swap.1 swap    defaults        0   0

Java REST Client with Basic Authentication

This Java Client can be used to invoke any RESTful endpoint by proving a baseURL, username and password.

import org.apache.commons.codec.binary.Base64;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
 
public class RESTInvoker {
    private final String baseUrl;
    private final String username;
    private final String password;
 
    public RESTInvoker(String baseUrl, String username, String password) {
        this.baseUrl = baseUrl;
        this.username = username;
        this.password = password;
    }
 
    public String getRESTResponse(String accountId){
       return getDataFromServer("account/" + accountId);
    }
 
    String getDataFromServer(String path) {
        StringBuilder sb = new StringBuilder();
        try {
            URL url = new URL(baseUrl + path);
            URLConnection urlConnection = setUsernamePassword(url);
            BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            reader.close();
 
            return sb.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
 
    private URLConnection setUsernamePassword(URL url) throws IOException {
        URLConnection urlConnection = url.openConnection();
        String authString = username + ":" + password;
        String authStringEnc = new String(Base64.encodeBase64(authString.getBytes()));
        urlConnection.setRequestProperty("Authorization", "Basic " + authStringEnc);
        return urlConnection;
    }
}

 

Linux Increase Networking Performance Tuning Network Stack (Buffers Size)

Starting a Stress Test to improve performance, I reach some limits when the system was under intense fire up. By default the Linux network stack is not configured for high speed large file transfer across WAN links. This is done to save memory resources. You can easily tune Linux network stack by increasing network buffers size for high-speed networks that connect server systems to handle more network packets.

The default maximum Linux TCP buffer sizes are way too small. TCP memory is calculated automatically based on system memory; you can find the actual values by typing the following commands:

$ cat /proc/sys/net/ipv4/tcp_mem

The default and maximum amount for the receive socket memory:

$ cat /proc/sys/net/core/rmem_default
$ cat /proc/sys/net/core/rmem_max

The default and maximum amount for the send socket memory:

$ cat /proc/sys/net/core/wmem_default
$ cat /proc/sys/net/core/wmem_max

The maximum amount of option memory buffers:

$ cat /proc/sys/net/core/optmem_max

 Tuning the Values

Set the max OS send buffer size (wmem) and receive buffer size (rmem) to 12 MB for queues on all protocols. In other words set the amount of memory that is allocated for each TCP socket when it is opened or created while transferring files:

WARNING! The default value of rmem_max and wmem_max is about 128 KB in most Linux distributions, which may be enough for a low-latency general purpose network environment or for apps such as DNS / Web server. However, if the latency is large, the default size might be too small. Please note that the following settings going to increase memory usage on your server.

Now, as root user…

# echo 'net.core.wmem_max=12582912' >> /etc/sysctl.conf
# echo 'net.core.rmem_max=12582912' >> /etc/sysctl.conf

You also need to set minimum size, initial size, and maximum size in bytes:

# echo 'net.ipv4.tcp_rmem= 10240 87380 12582912' >> /etc/sysctl.conf
# echo 'net.ipv4.tcp_wmem= 10240 87380 12582912' >> /etc/sysctl.conf

Turn on window scaling which can be an option to enlarge the transfer window:

# echo 'net.ipv4.tcp_window_scaling = 1' >> /etc/sysctl.conf

Enable timestamps as defined in RFC1323:

# echo 'net.ipv4.tcp_timestamps = 1' >> /etc/sysctl.conf

Enable select acknowledgments:

# echo 'net.ipv4.tcp_sack = 1' >> /etc/sysctl.conf

By default, TCP saves various connection metrics in the route cache when the connection closes, so that connections established in the near future can use these to set initial conditions. Usually, this increases overall performance, but may sometimes cause performance degradation. If set, TCP will not cache metrics on closing connections.

# echo 'net.ipv4.tcp_no_metrics_save = 1' >> /etc/sysctl.conf

Set maximum number of packets, queued on the INPUT side, when the interface receives packets faster than kernel can process them.

# echo 'net.core.netdev_max_backlog = 5000' >> /etc/sysctl.conf

Now reload the changes:

# sysctl -p

Use tcpdump to view changes for eth0, eth1 or wlan0, or…

# tcpdump -ni eth0

See the results, enjoy it!

 

 

 

 

Linus Jumps Kernel Ahead to 3.0

Last week it looked like we were, finally, going to get a version bump from 2.6 to 2.8. Instead, Linus Torvalds has bitten the bullet and tagged the first release candidate of the next kernel to 3.0.

That’s right — it looks like the next kernel release is going to go all the way to 11, er, 3.0. If you missed the discussion last week, this isn’t because the kernel is gaining massive new functionality (as it did from the 1.x to 2.0.x series), but because “it will get released close enough to the 20-year mark, which is excuse enough for me.” Sounds like a good enough reason here, too.

To be clear, 3.0 will not be a radical change. According to Torvalds, “Sure, we have the usual two thirds driver changes, and a lot of random fixes, but the point is that 3.0 is *just* about renumbering, we are very much *not* doing a KDE-4 or a Gnome-3 here. No breakage, no special scary new features, nothing at all like that. We’ve been doing time-based releases for many years now, this is in no way about features. If you want an excuse for the renumbering, you really should look at the time-based one (“20 years”) instead.”

Want to test the new kernel, check for it in the /pub/linux/kernel/v3.0 directory, though the git tree is still linux-2.6.git for now.

If we follow the “once per decade” model, it looks like we’ll have Linux 4.0 sometime in 2020.