O computador desktop Windows está conectado via cabo Ehternet de 1 GB ao NAS pessoal (em desenvolvimento) com o Ubuntu nele. Durante a leitura e gravação de arquivos (tamanho de > 1GB) de / para strace NAS foi realizado para monitorar as chamadas do sistema de processo samba, devido ao fato de que o samba é o que está fazendo um trabalho árduo.
Abaixo está a pequena seção da saída da strace:
mmap2(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb4eaf000 <0.000075>
pread(31, "53.2e7F577o{136657\#L20W36326"..., 1048576, 13631488) = 1048576 <0.010848>
writev(34, [{"617S575654LT{76!1662b4i71:x$\r7"..., 999020}], 1) = 49640 <0.000451>
gettimeofday({6146, 475882}, NULL) = 0 <0.000282>
gettimeofday({6146, 476842}, NULL) = 0 <0.000152>
poll([{fd=10, events=POLLIN|POLLHUP}, {fd=6, events=POLLIN|POLLHUP}, {fd=8, events=POLLIN|POLLHUP}, {fd=34, events=POLLIN|POLLOUT|POLLHUP}], 4, 57236) = 1 ([{fd=34, revents=POLLOUT}]) <0.000202>
Isso continua até que todos os bytes lidos sejam gravados no cache, após o qual a nova chamada do sistema pread
é seguida e assim por diante. (antes que a memória mmap2
-ed seja desfeita)
O que eu noto é que, mais tarde, as funções writev
retornaram números de bytes maiores e maiores, por exemplo
mmap2(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb4eaf000 <0.000304>
pread(31, "3757Q;170<\nl6ffmmap2(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb4eaf000 <0.000075>
pread(31, "53.2e7F577o{136657\#L20W36326"..., 1048576, 13631488) = 1048576 <0.010848>
writev(34, [{"617S575654LT{76!1662b4i71:x$\r7"..., 999020}], 1) = 49640 <0.000451>
gettimeofday({6146, 475882}, NULL) = 0 <0.000282>
gettimeofday({6146, 476842}, NULL) = 0 <0.000152>
poll([{fd=10, events=POLLIN|POLLHUP}, {fd=6, events=POLLIN|POLLHUP}, {fd=8, events=POLLIN|POLLHUP}, {fd=34, events=POLLIN|POLLOUT|POLLHUP}], 4, 57236) = 1 ([{fd=34, revents=POLLOUT}]) <0.000202>
1 J3T727623100y"..., 1048576, 458227712) = 1048576 <0.032897>
writev(34, [{"\t16hPq433x2X705<Jz1mmap2(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb4eaf000 <0.000304>
pread(31, "3757Q;170<\nl6ff%pre%1 J3T727623100y"..., 1048576, 458227712) = 1048576 <0.032897>
writev(34, [{"\t16hPq433x2X705<Jz1%pre%7060053"..., 674900}], 1) = 373760 <0.002618>
gettimeofday({6164, 906348}, NULL) = 0 <0.000149>
gettimeofday({6164, 907318}, NULL) = 0 <0.000149>
poll([{fd=10, events=POLLIN|POLLHUP}, {fd=6, events=POLLIN|POLLHUP}, {fd=8, events=POLLIN|POLLHUP}, {fd=34, events=POLLIN|POLLOUT|POLLHUP}], 4, 38805) = 1 ([{fd=34, revents=POLLOUT}]) <0.000199>
7060053"..., 674900}], 1) = 373760 <0.002618>
gettimeofday({6164, 906348}, NULL) = 0 <0.000149>
gettimeofday({6164, 907318}, NULL) = 0 <0.000149>
poll([{fd=10, events=POLLIN|POLLHUP}, {fd=6, events=POLLIN|POLLHUP}, {fd=8, events=POLLIN|POLLHUP}, {fd=34, events=POLLIN|POLLOUT|POLLHUP}], 4, 38805) = 1 ([{fd=34, revents=POLLOUT}]) <0.000199>
Posso de alguma forma influenciar na leitura e escrita de blocos de E / S ? Eu quero acelerar as coisas, então porque não começar com grandes tamanhos de blocos writev
desde o início. Se tamanho do bloco for o nome correto para os valores de retorno das funções pread
e writev
. É difícil distinguir a terminologia, já que há evidentemente tamanho de bloco para arquivos, bem como tamanho de bloco para discos.
Quando estou usando dd
, por exemplo, estou usando o parâmetro bs
influenciando o arquivo tamanho do bloco ? Como o tamanho do bloco é determinado no tempo de formatação e não há como alterá-lo em tempo real.
E, por último, posso de alguma forma impedir a chamada à função gettimeofday
, uma vez que não vejo a necessidade ou estou errado?
Desculpe se algumas das perguntas revelam uma alarmante falta de conhecimento, mas estou realmente tentando limpar toda a terminologia junto com os passos do meu bebê para o reino do Linux.