segunda-feira, 25 de agosto de 2014

Postgresql 9.2 Log ---> AVISO: pgstat wait timeout + Alguns dicas de performance do pg

, , , , , 0




Buenas,

Tenho um BI aqui na empresa o qual sempre dá alguns problemas insanos com o pg, porém hoje fiquei na cola dos caras, até pegar o momento exato que ocorre os problemas.

No pg ele lança a seguinte informação nos logs "AVISO:  pgstat wait timeout", como se ele não estivesse dando conta do recado.

Acompanhando IO estava tranquilo "iostat -x 1" porém ele continuava a reclamar.

Pesquisando aqui ali em questão de 15 minutos já tinha encontrado várias pedras para tentar resolver o problema.

Dentre elas a principal de todas "stats_temp_directory" onde o pq salva algumas estatísticas, onde o ideal seria carregar isso na memoria, e não em disco.

Então para jogar estas estatísticas na ram basta seguir estes passos.

# Diretório
mkdir /var/lib/pgsql_stats_tmp

# Permissão para a pasta geral
chmod 777 /var/lib/pgsql_stats_tmp

# Permissão "sticky-bit", onde todos podem ler, escrever e executar, porém so podem fazer isso com seus arquivos.
chmod +t /var/lib/pgsql_stats_tmp

# No fstab vamos montar o diretório e indicar o quanto de memoria ram ele vai ocupar, nesta caso 2G já esta ótimo.
tmpfs /var/lib/pgsql_stats_tmp tmpfs size=2G,uid=postgres,gid=postgres 0 0
# Agora é so reiniciar o serviço e correr para o abraço
/etc/init.d/postgresql-9.2 restart
# FSTAB dos diretórios
/dev/xvda1 / ext4 defaults,noatime,nodiratime,data=writeback,commit=100,nobh 1 1
/dev/xvda3 /db_sadig xfs defaults,noatime,nodiratime,allocsize=512m,barrier=0,inode64,logbufs=8 1 2

# Limites /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

# Sysctl.conf
vm.swappiness = 0 # não usa o swap
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 4194304
net.ipv4.tcp_rmem = 4096 262144 4194304
net.ipv4.tcp_wmem = 4096 262144 4194304
vm.dirty_background_ratio = 50
vm.dirty_ratio = 80
fs.file-max = 6815744
fs.aio-max-nr = 104857600
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.core.netdev_max_backlog = 65536
net.ipv4.tcp_rfc1337 = 1
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.conf.all.arp_notify = 1
# Aqui é feito calculos
# http://www.postgresql.org/docs/9.0/static/kernel-resources.html
# http://helkmut.blogspot.com.br/2011/07/postgresql-tunando-seu-shmmax-e-shmall.html
# http://michael.otacoo.com/postgresql-2/take-care-of-kernel-memory-limitation-for-postgresql-shared-buffers/
# http://serverfault.com/questions/341680/postgresql-performance-adjusting-shmmax-and-shmall
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

# postgresql.conf
#
# ATENCAÇÃO
# Não sou DBA, então pode ter parâmetros fora do normal, que na visão de um DBA estão errados,
# ou deveriam, ter outros valores. Então se você é DBA ou percebeu algum erro comunique-me.
#
#
listen_addresses = '*' # what IP address(es) to listen on;
max_connections = 300 # (change requires restart)
shared_buffers = 2048MB # min 128kB
# (change requires restart)
temp_buffers = 512MB # min 800kB
max_prepared_transactions = 300 # zero disables the feature
# (change requires restart)
work_mem = 256MB # min 64kB
maintenance_work_mem = 512MB # min 1MB
synchronous_commit = on # synchronization level;
# off, local, remote_write, or on
checkpoint_segments = 32 # in logfile segments, min 1, 16MB each
checkpoint_timeout = 1h # range 30s-1h
checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0
random_page_cost = 6.0 # same scale as above
effective_cache_size = 2048MB
log_destination = 'stderr' # Valid values are combinations of
logging_collector = on # Enable capturing of stderr and csvlog
log_directory = 'pg_log' # directory where log files are written,
# can be absolute or relative to PGDATA
log_filename = 'postgresql-%a.log' # log file name pattern,
# can include strftime() escapes
log_truncate_on_rotation = on # If on, an existing log file with the
# in all cases.
log_rotation_age = 1d # Automatic rotation of logfiles will
# happen after that time. 0 disables.
log_rotation_size = 0 # Automatic rotation of logfiles will
# happen after that much log output.
#log_lock_waits = off # log lock waits >= deadlock_timeout
log_statement = 'all' # none, ddl, mod, all
#log_temp_files = -1 # log temporary files equal or larger
# than the specified size in kilobytes;
# -1 disables, 0 logs all temp files
log_timezone = 'Brazil/East'
log_checkpoints = on
stats_temp_directory = '/var/lib/pgsql_stats_tmp'
datestyle = 'iso, dmy'
#intervalstyle = 'postgres'
timezone = 'Brazil/East'
# These settings are initialized by initdb, but they can be changed.
lc_messages = 'pt_BR.ISO88591' # locale for system error message
# strings
lc_monetary = 'pt_BR.ISO88591' # locale for monetary formatting
lc_numeric = 'pt_BR.ISO88591' # locale for number formatting
lc_time = 'pt_BR.ISO88591'
default_text_search_config = 'pg_catalog.english'
default_with_oids = off
escape_string_warning = on
standard_conforming_strings = on

sexta-feira, 8 de agosto de 2014

Jquery SHA1 + php + mysql + tcpdump = Login seguro

, , , 0




Salve Salve turma,

Tava fazendo umas brincadeiras, quando eu pude perceber que podemos ter problemas de seguranças em formulários que não são https e tem uma senha digitada.

Não vou demonstrar o php recebendo os valores, pois este não é o intuito.

- Primeiro uma pagina simples...

Formulário simples, onde envia para o php

<script type="text/javascript">
    $(document).ready(function() {
        $("#FormLogin").submit(function() {
            $.post('<?php echo site_url('login/logar'); ?>',
                    $(this).serialize(),
                    function(data) {
                        $("#retorno").html(data)
                    }
            );
            return false;
        });
    });
</script>

    <form class="form-signin" id="FormLogin" method="post" role="form">
        <h2 class="form-signin-heading logo_login"></h2>
        <h4 class="form-signin-heading">Extranet Dal Mobile LTDA</h4>
        <input name="usuario" type="text" class="form-control" placeholder="Usuário" required autofocus>
        <input name="senha" type="password" class="form-control" placeholder="Senha" required>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Logar</button>
        <br>
        <div id="retorno"></div>    
    </form>




- Testando
[root@note-marcos upload]# tcpdump -i lo -vvv -l -A | grep -i admin

........usuario=admin&senha=123


- Como vai ficar

<script src="http://www.astronomy.ie/print/www.independent.ie/independent.ie/javascript/jquery.sha1.js%3Fv=3"></script>

<script type="text/javascript">
    $(document).ready(function() {
        $("#FormLogin").submit(function() {

            var pass = $.sha1($('input[name="senha"]').val()); // Pega o value do input e manda para a função
            $('input[name="senha"]').val(""); // Limpa o input da senha
            $('input[name="senha"]').val(pass); // Grava no input da senha a nova senha em sha1

            $.post('<?php echo site_url('login/logar'); ?>',
                    $(this).serialize(),
                    function(data) {
                        $("#retorno").html(data)
                    }
            );
            return false;
        });
    });
</script>

    <form class="form-signin" id="FormLogin" method="post" role="form">
        <h2 class="form-signin-heading logo_login"></h2>
        <h4 class="form-signin-heading">Extranet Dal Mobile LTDA</h4>
        <input name="usuario" type="text" class="form-control" placeholder="Usuário" required autofocus>
        <input name="senha" type="password" class="form-control" placeholder="Senha" required>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Logar</button>
        <br>
        <div id="retorno"></div>    
    </form>


- Testando novamente 
[root@note-marcos upload]# tcpdump -i lo -vvv -l -A | grep -i admin

........usuario=admin&senha=40bd001563085fc35165329ea1ff5c5ecbdbbeef

terça-feira, 22 de julho de 2014

Mysql - Tabela para armazenar imagens e grandes textos

, , , , , , , , 0




Bueno, se você esta montando algum sistema de notícias, que o mesmo vai ter imagens, e muito texto, e não deseja hospedar as imagens, então suba todo no banco. 

Para o editor estou utilizando o http://hackerwins.github.io/summernote/ junto do http://getbootstrap.com/

Então lembre-se que a coluna que vai armazenar o conteúdo, deve ter estes tipos, avalie o tamanho que podera ter e utilize a de acordo.

TINYBLOB, TINYTEXT                                 (255 Bytes) 
    BLOB, TEXT                                                    (64 Kilobytes) 
       MEDIUMBLOB, MEDIUMTEXT                 (16 Megabytes) 
  LONGBLOB, LONGTEXT                              (4 Gigabytes)

Forte quebra costelas,
Marcos Carraro.

quarta-feira, 18 de junho de 2014

Segmentando a rede Visitantes da rede principal

, , , , , , , , , , , , , , , 0




Segmentando a rede visitantes da rede principal.
Equipamentos.
Switch HP
Access Point Ubiquiti UNIFI ULR

Vlan
Vlan da visitantes 220
Configurações na Switch
No switch vamos configurar a porta onde este conectado o AP para usar a porta como tagged (trunk) com as vlans:  1 (Vlan default da rede), 220 (Vlan para a rede visitantes).
Também não podemos esquecer de configurar a porta onde esta conectado o servidor de DHCP e o Roteador para que eles possam enxergar esta rede, distribuir os IPs e fazer os roteamentos.

1 – Criando a VLAN
2 – Configurando a porta onde esta conectado o AP, selecione a VLAN desejada e coloque como “tagged” em outras palavras é “trunk”, as portas que participam da vlan 220 ficaram em verde, caso alguma porta fosse dedicada a esta VLAN ficaria em AZUL.
Feito esta alterações, clique em “apply” e depois no menu da esquerda Device->Configuration
Na aba “Save” clique no botão “Save Currente Settings”, pronto estamos com a switch configurada.
Vamos ao próximo passo configurar a interface com a VLAN no firewall.
Configurando Interface no Servidor
O arquivo de configuração deve ser cirado em  /etc/sysconfig/network-scripts/ (Familia RedHatLike), o nome fica
ifcfg-(Placa de rede com o cabo conectado na switch).(ID da vlan)
Exemplo: ifcfg-eth1.220
# cat /etc/sysconfig/network-scripts/ifcfg-eth1.220
VLAN=yes
DEVICE=eth1.220
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.10.1
NETMASK=255.255.255.0


Configurando DHCPD
 Primeiro, deve-se indicar quais interfaces estarão distribuindo os IPS, para isso altere o arquivo /etc/sysconfig/dhcpd.
# cat /etc/sysconfig/dhcpd
# Command line options here
DHCPDARGS=eth1 eth1.220

Arquivo dhcpd.conf
# cat /etc/dhcpd.conf
ddns-update-style none;
default-lease-time 259200;
max-lease-time 518400;
authoritative;
log-facility local7;

# REDE ADM
subnet 192.168.1.0 netmask 255.255.255.0 {
# --- default gateway
        option routers                  192.168.1.254;
        option subnet-mask              255.255.255.0;

        option domain-name-servers      192.168.1.253;
        option netbios-name-servers     192.168.1.253;
        option ntp-servers              192.168.1.253;
        option domain-name              "rede.interna";

        range 192.168.1.10 192.168.1.240;
        option broadcast-address 192.168.1.255;

ddns-update-style none;
default-lease-time 259200;
max-lease-time 518400;
authoritative;
log-facility local7;

#--------------------------------------------------------
# ips fixados
  host coletor1 {
hardware ethernet 00:23:68:E4:7F:78;
fixed-address 192.168.1.150;
   }
}
# REDE VISITANTES
subnet 192.168.10.0 netmask 255.255.255.0 {
# --- default gateway
        option routers                  192.168.10.1;
        option subnet-mask              255.255.255.0;

        option domain-name-servers      192.168.10.1;
        option domain-name              "rede.interna";

        range 192.168.10.10 192.168.10.90;
        option broadcast-address 192.168.10.255;
}

Configurando APs
Para isso tem que estar rodando o próprio programa da Ubiquiti. Então acesso o seu IP no navegador na porta 8443.
Vá em Wireless networks, supondo que você já tenha uma rede criada vamos configurar a VLAN.

Feito isso clique em “apply” e esta finalizado.




Forte Abraço
Marcos Carraro















segunda-feira, 28 de abril de 2014

C/C++ Função validar IP faz parte da Rede/Mascara

, , , 0




Buenas,

Segue uma pequena função em C/C++ que valida se o IP x esta na rede Y com a mascara Z.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

//---------------------------------------------------------------------
long ip2long(const char *ip,int mascara, const char *rede){
    int ip_host_long,ip_rede_long,maximo,retorno;

    // Converte o IP do HOST no modo long - clong
    ip_host_long = htonl(inet_addr(ip));
    // Converte o IP da REDE no modo long - min
    ip_rede_long = htonl(inet_addr(rede));

    // Definindo o maximo
    maximo = (ip_rede_long | ((1 << (32 - mascara)) -1));

// Validando
    if(ip_host_long > ip_rede_long && ip_host_long < maximo){
        // Faz parte da rede e da mascara
        retorno = 1;
    } else {
        // Nao faz parte da rede e da mascara
        retorno = 0;
    }

    return retorno;
}


//---------------------------------------------------------------------

int main()
{
    const char *ip;
    int mascara;
    const char *rede;

    mascara = 24;
    rede = "192.168.1.0";
    ip = "192.168.2.3";

    long ip_longo = ip2long(ip,mascara,rede);


    printf("%u\n", ip_longo);


    return 0;
}


Forte abraço
Marcos Carraro

quarta-feira, 16 de abril de 2014

Centos 6 x64 + php 5.3 + bcompiler Com exemplo de arquivo php

, , , 0




Buenas,

Vamos botar para quebrar com o Centos minimal 6 atualizado com o php 5.3 (http://www.php.net/manual/pt_BR/book.bcompiler.php) e também vamos compilar o módulo bcompiler (http://pecl.php.net/package/bcompiler) para criar arquivos binários do php.

Instalação

Entrar no diretório
# cd /usr/src/

Baixar o pacote mais atual
# wget http://pecl.php.net/get/bcompiler

Descompactar o arquivo
# tar -xvsf bcompiler

# cd bcompiler-1.0.2/

PHPIZE Prepara o ambiente para a compilação (http://php.net/manual/pt_BR/install.pecl.phpize.php)
# phpize

Procedimentos comuns para a compilação
# ./configure
# make

A propria extensão manda fazer um teste antes de compilar verdadeiramente
# make test
# make install

Feito isso e não teve nenhum erro show de bola terminamos a compilação e a instalação.

Ao terminar a compilação ele retorna a mensagem de concluído, e também o diretório onde foi gravado o arquivo no meu caso "/usr/lib64/php/modules/"

Vamos agora para a ativação da extensão no php.

# cd /etc/php.d/

# vim bcompiler.ini

Cole o seguinte conteudo

; Ativando a extensao do bcompiler
extension=bcompiler.so


Reiniciando o serviço httpd.

# service httpd restart


Exemplos

No meu caso vou estar utilizando os arquivos compilados pelo php para a linha de comando (http://php.net/manual/pt_BR/features.commandline.php), para obter mais desempenho.



<?php

// $fh é o arquivo de destino, onde vai ser gravado a compialação
// repare na extensao do arquivo não é mais php e sim phb
$fh = fopen("arq_src.phb", "w");
bcompiler_write_header($fh);
// $fh é o arquivo de origem onde tem o codigo php cru
bcompiler_write_file($fh, "arq_src.php");
bcompiler_write_footer($fh);
fclose($fh);

?>




sexta-feira, 11 de abril de 2014

Criando Fluxo em ASCII

, , , 0




Buenas,

Ta aqui uma baita ferramente que fazia falta, criar fluxo em modo texto para usar nos script.

http://asciiflow.com/

A ferramente é baseada na web e é muito fácil de usar, com isso monta-se os fluxos e depois cola no script indicando o que ele deve fazer.

Forte Abraços
Marcos Carraro