{"id":4700,"date":"2019-06-29T15:18:08","date_gmt":"2019-06-29T18:18:08","guid":{"rendered":"https:\/\/blog.clusterweb.com.br\/?p=4700"},"modified":"2019-06-29T15:18:08","modified_gmt":"2019-06-29T18:18:08","slug":"linux-virtual-memory-management","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=4700","title":{"rendered":"Linux Virtual Memory Management"},"content":{"rendered":"<p>Se voc\u00ea usa Linux, alguma vez j\u00e1 notou uma lentid\u00e3o extrema &#8211; a ponto de algumas vezes deixar o sistema irresponsivo &#8211; ao copiar arquivos grandes, de alguns gigabytes, para m\u00eddias lentas, como pendrives USB (especialmente aqueles &#8220;gen\u00e9ricos&#8221;, que oferecem baixa performance)? Se o seu computador \u00e9 64 bits e tem bastante mem\u00f3ria RAM (8 GB ou mais), muito provavelmente j\u00e1 notou isso. Tanto \u00e9 que at\u00e9 o Linus Torvalds j\u00e1 abordou esse problema [1], h\u00e1 alguns anos atr\u00e1s; mesmo assim, ainda n\u00e3o h\u00e1 uma solu\u00e7\u00e3o definitiva, mas existem tunings do subsistema de\u00a0<em>Virtual Memory<\/em>\u00a0do kernel do Linux que minimizam esse problema.<\/p>\n<p>Antes de continuar, \u00e9 preciso entender um pouco sobre alguns conceitos do gerenciamento de mem\u00f3ria do Linux. N\u00e3o vou entrar em muitos detalhes, pois este n\u00e3o \u00e9 um artigo acad\u00eamico, mas no final colocarei algumas refer\u00eancias para quem quiser se aprofundar mais. Um primeiro conceito que deve ficar claro \u00e9: o Linux trabalha por padr\u00e3o com\u00a0<em>buffered I\/O<\/em>. De forma simplificada, isso significa que as opera\u00e7\u00f5es de escrita simplesmente copiam os dados para a mem\u00f3ria RAM [2], e depois, em background, o kernel vai fazendo a escrita em si (<em>flush<\/em>) no dispositivo destino. Dado isto, entra o segundo conceito:\u00a0<em>dirty memory<\/em>, que \u00e9 justamente essa informa\u00e7\u00e3o que est\u00e1 temporariamente na mem\u00f3ria RAM, esperando ser escrita em um dispositivo de armazenamento.<\/p>\n<p><!--more--><\/p>\n<p>Acontece que, quando copiamos muitos dados para uma m\u00eddia lenta, h\u00e1 um problema de\u00a0<em>bufferbloat<\/em>, em que a fila de\u00a0<em>I\/O requests<\/em>\u00a0fica gigantesca. Isso acarreta toda a lentid\u00e3o, j\u00e1 que outras opera\u00e7\u00f5es de I\/O s\u00e3o tamb\u00e9m afetadas, al\u00e9m de outros efeitos colaterais. Dentre as alternativas propostas para minimizar este problema, as mais simples envolvem ajustar os par\u00e2metros relacionados \u00e0\u00a0<em>dirty memory<\/em>\u00a0do subsistema de\u00a0<em>Virtual Memory<\/em>\u00a0do kernel [3][4]. O objetivo \u00e9 deixar a fila menor, definindo um\u00a0<em>threshold<\/em>\u00a0mais agressivo para o\u00a0<em>flush<\/em>\u00a0da\u00a0<em>dirty memory<\/em>\u00a0para o dispositivo (o\u00a0<em>daemon<\/em>\u00a0que controla isso \u00e9 o\u00a0<code>pdflush<\/code>, para quem quiser se aprofundar).<\/p>\n<h1>1. Procedimentos<\/h1>\n<p>Antes de experimentar os ajustes em quest\u00e3o, conv\u00e9m monitorar o seu sistema durante uma simula\u00e7\u00e3o, a fim de confirmar o problema. O sintoma mais \u00f3bvio \u00e9 a lentid\u00e3o, mas se voc\u00ea quiser ir mais a fundo, pode monitorar a quantidade de\u00a0<em>dirty memory<\/em>\u00a0com o seguinte comando:<\/p>\n<pre>  watch -n1 grep -e Dirty: \/proc\/meminfo\r\n<\/pre>\n<p>Enquanto monitora, copie um arquivo grande, de alguns gigabytes, para um pendrive (n\u00e3o vale aquele pendrive USB 3.0 de \u00faltima gera\u00e7\u00e3o, hein?). Observe a\u00a0<em>dirty memory<\/em>\u00a0aumentar assustadoramente, para alguns GBs, at\u00e9 que o\u00a0<em>pdflush<\/em>\u00a0entra em a\u00e7\u00e3o e come\u00e7a a escrever os dados no dispositivo.<\/p>\n<p>Percebeu que, aparentemente, a c\u00f3pia rapidamente deu-se como conclu\u00edda, mas na pr\u00e1tica ela estava longe de terminar? Da\u00ed a import\u00e2ncia de n\u00e3o remover o pendrive sem ejetar antes: podem haver muitos dados pendentes de escrita em\u00a0<em>background<\/em>, e a opera\u00e7\u00e3o de eje\u00e7\u00e3o s\u00f3 vai concluir ap\u00f3s eles estarem devidamente gravados.<\/p>\n<p>Agora, vamos ao\u00a0<em>tuning<\/em>: os par\u00e2metros importantes aqui s\u00e3o<code>vm.dirty_background_bytes<\/code>,\u00a0<code>vm.dirty_background_ratio<\/code>,\u00a0<code>vm.dirty_bytes<\/code>\u00a0e\u00a0<code>vm.dirty_ratio<\/code>. Na documenta\u00e7\u00e3o do kernel voc\u00ea encontra uma explica\u00e7\u00e3o detalhada do que cada par\u00e2metro faz [5], mas pelos nomes j\u00e1 d\u00e1 para ter uma ideia. S\u00f3 h\u00e1 um detalhe: os par\u00e2metros com &#8220;bytes&#8221; e &#8220;ratio&#8221; s\u00e3o mutuamente exclusivos, ou seja, ajustando um, o outro automaticamente \u00e9 desabilitado (ficando com valor 0). No meu sistema, os valores\u00a0<em>default<\/em>\u00a0s\u00e3o:<\/p>\n<pre>  vm.dirty_background_bytes = 0\r\n  vm.dirty_background_ratio = 20\r\n  vm.dirty_bytes = 0\r\n  vm.dirty_ratio = 50\r\n<\/pre>\n<p>Perceba que at\u00e9 50% da mem\u00f3ria RAM total pode ser\u00a0<em>dirty<\/em>! Vamos ent\u00e3o ajustar os par\u00e2metros para uma das recomenda\u00e7\u00f5es, e ver o que acontece, repetindo a simula\u00e7\u00e3o:<\/p>\n<pre>  sysctl -w vm.dirty_background_bytes=16777216\r\n  sysctl -w vm.dirty_bytes=50331648\r\n  watch -n1 grep -e Dirty: \/proc\/meminfo\r\n  (repetir c\u00f3pia do arquivo)\r\n<\/pre>\n<p>Bem diferente, n\u00e3o \u00e9? Sem contar que agora o indicador de progresso da c\u00f3pia \u00e9 mais confi\u00e1vel.<\/p>\n<p>Outra op\u00e7\u00e3o, que d\u00e1 resultados similares mas trabalha com percentuais da mem\u00f3ria RAM, ao inv\u00e9s de valores absolutos em bytes, \u00e9:<\/p>\n<pre>  sysctl -w vm.dirty_background_ratio=5\r\n  sysctl -w vm.dirty_ratio=10\r\n<\/pre>\n<h1>2. Conclus\u00e3o<\/h1>\n<p>Tal situa\u00e7\u00e3o de\u00a0<u>bufferbloat<\/u>\u00a0\u00e9 mais usual em desktops, onde \u00e9 comum realizar a c\u00f3pia de arquivos grandes para pendrives lentos, mas \u00e9 tamb\u00e9m poss\u00edvel de acontecer, com cen\u00e1rios alternativos, em servidores, sendo importante conhecer o problema, a solu\u00e7\u00e3o, e o que est\u00e1 por tr\u00e1s dela. Claro que os valores sugeridos no\u00a0<u>tuning<\/u>\u00a0s\u00e3o, como disse, recomenda\u00e7\u00f5es; o ideal para o seu caso pode variar.<\/p>\n<p>O que acho mais interessante em solucionar esses problemas \u00e9 que, quando queremos ir al\u00e9m do b\u00e1sico, al\u00e9m da receita de bolo, aprendemos muito. Espero que tamb\u00e9m tenha sido sua percep\u00e7\u00e3o, e se quiser ir ainda al\u00e9m, \u00e9 s\u00f3 explorar as refer\u00eancias.<\/p>\n<h1>3. Refer\u00eancias<\/h1>\n<ol>\n<li><a href=\"http:\/\/yarchive.net\/comp\/linux\/dirty_limits.html\">https:\/\/yarchive.net\/comp\/linux\/dirty_limits.html<\/a><\/li>\n<li><a href=\"http:\/\/lwn.net\/Articles\/682582\/\">https:\/\/lwn.net\/Articles\/682582\/<\/a><\/li>\n<li><a href=\"http:\/\/unix.stackexchange.com\/questions\/107703\/why-is-my-pc-freezing-while-im-copying-a-file-to-a-pendrive\/107722#107722\">https:\/\/unix.stackexchange.com\/questions\/107703\/why-is-my-pc-freezing-while-im-copying-a-file-to-a-pendrive\/107722#107722<\/a><\/li>\n<li><a href=\"http:\/\/askubuntu.com\/questions\/397249\/system-freezes-unresponsive-unusable-when-copying-large-file-to-usb\">https:\/\/askubuntu.com\/questions\/397249\/system-freezes-unresponsive-unusable-when-copying-large-file-to-usb<\/a><\/li>\n<li><a href=\"https:\/\/www.kernel.org\/doc\/Documentation\/sysctl\/vm.txt\">https:\/\/www.kernel.org\/doc\/Documentation\/sysctl\/vm.txt<\/a><\/li>\n<\/ol>\n<h1>4. Sobre o autor<\/h1>\n<p>Dorian Bolivar \u00e9 Engenheiro de Sistemas especialista em Linux, com mais de 15 anos de experi\u00eancia na \u00e1rea. Trabalha gerenciando diariamente centenas de servidores Linux. Visite o website:\u00a0<a href=\"http:\/\/www.dorianbolivar.com\/\">https:\/\/www.dorianbolivar.com<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se voc\u00ea usa Linux, alguma vez j\u00e1 notou uma lentid\u00e3o extrema &#8211; a ponto de algumas vezes deixar o sistema irresponsivo &#8211; ao copiar arquivos grandes, de alguns gigabytes, para m\u00eddias lentas, como pendrives USB (especialmente aqueles &#8220;gen\u00e9ricos&#8221;, que oferecem baixa performance)? Se o seu computador \u00e9 64 bits e tem bastante mem\u00f3ria RAM (8 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1082,1,730,830,42,51,495,548,691],"tags":[384,158,1347,351,1348,1350,1346,14,615,1345,1349,355,421],"class_list":["post-4700","post","type-post","status-publish","format-standard","hentry","category-centos-7-rhel-7","category-viazap","category-clusterweb","category-debian","category-leitura-recomendada","category-linux-linuxrs","category-profissional-de-ti","category-ubuntu-2","category-virtualizacao-2","tag-ao","tag-arquivos","tag-copiar","tag-e","tag-grandes","tag-lenta","tag-lentidao","tag-linux","tag-management","tag-memory","tag-midia","tag-para","tag-virtual"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4700","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4700"}],"version-history":[{"count":1,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4700\/revisions"}],"predecessor-version":[{"id":4701,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4700\/revisions\/4701"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}