BEM VINDO AO BLOG DO MARCOS CARRARO CRIADOR DO "CARRARO DASHBOARD". MUITO MAIS QUE UM SIMPLES BLOG.
Mostrando postagens com marcador performance. Mostrar todas as postagens
Mostrando postagens com marcador performance. Mostrar todas as postagens

quarta-feira, 25 de fevereiro de 2015

Resolver problema Download .zip com PHP Corrompendo + Limitando Velocidade de Download de Arquivo com PHP

Bom Dia,


Hoje finalizei um sistema e por incrível que parece por algum motivo estranho ele corrompia os downloads em zip, fazendo algumas buscas comentaram do mod deflat do apache, onde ele faz a compressão dos arquivos para melhorar a performance do site e ocupar menos banda (Para testes:  http://www.whatsmyip.org/http-compression-test/  ) .

Ok, então no meu .htaccess inseri a seguinte linha.

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript application/javascript application/ecmascript application/rss+xml
</IfModule>

Onde segundo ele deveria apenas compactar estes "mimes types", porém ele acabou compactando o .zip achei estranho, porém acabou resolvendo o problema, ainda fiquei "encucado" com o porque que ele compactou sendo que não declarei ele.

Download do zip resolvido é hora de ir para o php, onde vamos limitar a velocidade do download do usuário.

            // header para forçar download
            header('Content-Description', 'File Transfer');
            header('Pragma: public');
            header('Expires: 0');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Cache-Control: private', false);
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename="arquivo.zip"'); // Nome do arquivo
            header('Content-Transfer-Encoding: binary');
            header('Content-Length: ' . filesize('./upload/arquivo.zip'));
            header('Connection: close');
            // Metodo com limitacao de banda para 150k
            flush();
            $arqAberto = fopen("./upload/arquivo.zip", 'rb');
            while (!feof($arqAberto)) {
                echo fread($arqAberto, round(150 * 1024));
                flush();
                sleep(1);
            }
            fclose($arqAberto);


Forte abraço
Marcos Carraro.


Read More

segunda-feira, 23 de fevereiro de 2015

Testando "throughput" de rede

Boa Noite,

Pessoal, hoje vamos ver como fazer um teste de carga na rede / servidor.

Partindo do princípio que você esteja usando Centos/Fedora instale no servidor e no cliente o pacote "iperf"

No servidor vamos colocar ele em modo de "escuta"

# Ip Servidor: 192.168.1.1
# iperf -s

Cliente
# iperf -c 192.168.1.1

Agora vamos aumentar o tamanho do buffer para 10mb, para fazer isso utilize o parâmetro "-w 10M" de 10M pode ser até 10G

Exemplos

# Ip Servidor: 192.168.1.1
# iperf -s -w 10M

Cliente
# iperf -c 192.168.1.1 -w 10M

Agora faça a leitura deste arquivo para otimizar alguns parâmetros do kernel para melhorar a rede
https://www.frozentux.net/documents/ipsysctl-tutorial/

Tem um link no digitalocean que não consigo encontrar que também tratava dos parâmetros de kernel era mais direto ao ponto.

Mais informações
https://iperf.fr/

Obs:. O ideal é antes de botar para funcionar os novos parâmetros é de salvar o valor default do mesmo, pois as vezes existe a melhora como pode piorar.

Bons Testes
Read More

quarta-feira, 7 de janeiro de 2015

Criando uma ISO Customizada do Centos 6.6 + Incluir pacote na ISO

Buenas, feliz ano novo que 2015 seja ótimo.

Hoje vamos ver como criar uma instalação personalizada do centos utilizando o Kickstart não vou explicar linha por linha do arquivo pois no site do Fedora existe um documento completo referente a ele.

1- Preparação do diretório, vamos trabalhar na home do usuário root, para isso.
# su root
# cd ~
# mkdir build

2 - Faça o download da ISO no site do centos
# cd ~
# wget http://centos.ufms.br/6.6/isos/x86_64/CentOS-6.6-x86_64-minimal.iso

3 - Monte a ISO e extraia o seu conteudo para  a pasta build
# mount -o loop CentOS-6.6-x86_64-minimal.iso /mnt
# cd /mnt
# tar -cf - . | (cd ~/build/ ; tar -xvpf - )
# umout /mnt

4 - Crie o arquivo Kickstart Obs:. Segue um kickstart bem simples
# vim ~/build/ks.cfg
=======================================================================

#
# Marcos Carraro - Kickstart
#
# SO: Centos 6.6 x64
# Desc: Centos minimal, ainda mais leve com pequenas alteracoes, criacao da estrutura dos arquivos em LVM\
#  ip default: 15.0.0.1/24 | senha root default: abc123! | No minimo 10gb de disco e 1gb de memoria
#
#

install
cdrom
lang pt_BR.UTF-8
keyboard br-abnt2
network --onboot yes --device eth0 --bootproto static --ip 15.0.0.1 --netmask 255.255.255.0 --noipv6 --hostname atomicserver
rootpw  --iscrypted $6$Dr2vTVfUFzXVwn.t$n2hGfw0pa/cv7W.e/z21glUPkMHZAlsVAfB/NFxWBCjQZlQPWQwQjs1L6kuzghRqYzjL5AghYuXSv/EoceYjO0
firewall --disabled
authconfig --enableshadow --passalgo=sha512
selinux --disabled
timezone --utc America/Sao_Paulo


#
# Disco e particionamento
#
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto quiet"
#clearpart --all --initlabel --drives=sda
clearpart --all --initlabel

part /boot --fstype=ext4 --asprimary --size=256
part pv.202002 --grow --size=200

volgroup vg_disco --pesize=4096 pv.202002
logvol swap --name=lv_swap --vgname=vg_disco --size=1024
logvol / --fstype=ext4 --name=lv_tudo --vgname=vg_disco --size=1024
logvol /var  --fstype=ext4 --name=lv_var --vgname=vg_disco --size=1024

#
# Repositorio para instalar os pacotes
#
repo --name="CentOS"  --baseurl=file:///mnt/source --cost=100

#
# Desabilita alguns servicos
#
services --disabled=auditd,ip6tables,iptables,mdmonitor

#
# pacotes que serao instalados
#
%packages --nobase --excludedocs

#
# Instalar pacotes...
#
@core
perl
tcpdump
bc
vconfig
vim-common
vim-enhanced
traceroute
bind-utils

#
# Remover pacotes...
#
-selinux*
-libselinux*
-dhclient*
-mdadm*

%end

#
# Reinicia o servidor apos a instalacao
#
reboot

=======================================================================

5 - Instale o plugin do yum para baixar os pacotes
# yum install yum-plugin-downloadonly

6 - Baixe os pacotes que deseja incluir no nosso caso  o vim, traceroute, bind-utils, vconfig, bc
# yum install --downloadonly --downloaddir=~/build/Packages/ $(repoquery --requires tcpdump vim-common vim-enhanced bc vconfig traceroute bind-utils perl perl-libs)
# yum install --downloadonly --downloaddir=~/build/Packages/ tcpdump vim-common vim-enhanced bc vconfig traceroute bind-utils perl perl-libs

7 - Atualize o repositório da ISO.
# cd ~/build/
# createrepo -v --update -g `find repodata -iname *minimal*.xml` .

8 - Criar as entradas no menu de boot
# vim isolinux/isolinux.cfg
Adicione as seguintes linhas logo acima do "label linux"
Obs:. Lembre de remover o "menu default" da entrada do "lavel linux"

label AtomicServer
  menu label ^Instalacao do Centos Customizado
  menu default
  kernel vmlinuz
  append initrd=initrd.img ks=cdrom:/ks.cfg nomodeset

9 - Crie a iso
# cd ~/build
# mkisofs -joliet-long -z -T -o ../Centos-6.6-x64_Customizado.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -m TRANS.TBL .

10 - Instale ele.

Forte abraço
Marcos Carraro


Read More

sexta-feira, 5 de setembro de 2014

Postgresql - Cacuum+ Reindex = Todo Banco

Buenas,

Talvez para os deconhecidos, ou não, segue um script para fazer uma pequena manutenção no banco Postgresql

#!/bin/bash

# Vaccum organiza os registros
# -a  Todos os Banco de Dados.
# -f  Full
# -z  Analyze
# -v  Exibe mensagens de debug
/usr/bin/vacuumdb -a -z -f -U postgres


# REINDEX
# -a Todos os bancos
# -s Reindexa os catálogos do sistema do banco de dados.
/usr/bin/reindexdb -a -U postgres


Lembrando que no pg_hba.conf deve estar setado para não pedir senha para as conexões locais, caso contrário terá que informar no script a senha utilizando o parâmetro -W.
local   all             all                                     trust

Forte abraços
Marcos Carraro
Read More

segunda-feira, 25 de agosto de 2014

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

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
Read More

quarta-feira, 16 de abril de 2014

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

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);

?>




Read More

quinta-feira, 3 de abril de 2014

Mysql Usando CASE com WHERE com Coluna Virtual - ATUALIZADO

Buenas,

Muitas vezes precisamos montar uma coluna virtual no mysql somente para aquela consulta, onde devemos aplicar um filtro, sem ter que ir para a programação apenas no banco para termos um desempenho melhor.

A situação.

Tabela Dias

Colunas
ID DIA HORA

Precisamos comparar alguns valores se estiverem OK retornar 1 caso contrário retornar 0

select
    ID,
   @DiaValido := (CASE WHEN (DAYOFWEEK(NOW()) = '7' && a.dia = '7')&&(DAYOFWEEK(NOW()) = '7' && b.dia = '1' ) THEN '1'
WHEN (DAYOFWEEK(NOW()) >= a.dia) && (DAYOFWEEK(NOW()) <= b.dia) then '1'
ELSE '0' END) as DiaValido
from
    Dias a,
   Dias b,
where @DiaValido = 1

Desta maneira conseguimos obter melhor desempenho, pois não vamos precisar programar, apenas fazendo a consulta no banco, ganhando assim mais performance.

Atualizando 03/04/2014 - 1058 .
A consulta anterior estava levando 2.15ms para retornar banco pequeno, máquina pequena.

Ao invés de criar uma Coluna Virtual (nome verdadeiro Variável), utilizei o parâmetro HAVING, com isso ganhei 0,20 ms de tempo, pensando em um banco maior, com mais registros....

select
    ID,
(CASE WHEN (DAYOFWEEK(NOW()) = '7' && a.dia = '7')&&(DAYOFWEEK(NOW()) = '7' && b.dia = '1' ) THEN '1'
WHEN (DAYOFWEEK(NOW()) >= a.dia) && (DAYOFWEEK(NOW()) <= b.dia) then '1'
ELSE '0' END) as DiaValido
from
    Dias a,
   Dias b,
HAVING DiaValido = 1

Forte quebra costelas
Marcos Carraro
Read More

domingo, 26 de janeiro de 2014

Compactando Saida HTML CodeiGniter - Parte 2

Dica rápida mas boa.

O que vai acontecer é que a saida do codigo HTML gerado pelas views do CodeiGniter vão ser mais compactas, removendo espaços desnecessários, com isso vai se ganhar mais performance, e também dá uma dificultada na visualização do código html.



application/config/config.php

$config['enable_hooks'] = TRUE;

Cole o seguinte conteudo no arquivo
application/config/hooks.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Hooks
| -------------------------------------------------------------------------
| This file lets you define "hooks" to extend CI without hacking the core
| files.  Please see the user guide for info:
|
| http://codeigniter.com/user_guide/general/hooks.html
|
*/
$hook['display_override'][] = array(
'class' => '',
'function' => 'compress',
'filename' => 'compress.php',
'filepath' => 'hooks'
);


/* End of file hooks.php */
/* Location: ./application/config/hooks.php */

Então agora crie o arquivo compress em 
application/hooks/compress.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
function compress()
{
$CI =& get_instance();
$buffer = $CI->output->get_output();
 
$search = array(
'/\n/', // replace end of line by a space
'/\>[^\S ]+/s', // strip whitespaces after tags, except space
'/[^\S ]+\</s', // strip whitespaces before tags, except space
'/(\s)+/s' // shorten multiple whitespace sequences
 );
 
$replace = array(
' ',
'>',
'<',
'\\1'
 );
 
$buffer = preg_replace($search, $replace, $buffer);
 
$CI->output->set_output($buffer);
$CI->output->_display();
}
 
/* End of file compress.php */
/* Location: ./system/application/hools/compress.php */
Read More

Posts que a turma mais esta lendo...

Posts que a turma mais esta lendo...

Marcos Carraro