{"id":2761,"date":"2017-02-10T17:15:41","date_gmt":"2017-02-10T15:15:41","guid":{"rendered":"https:\/\/www.systemcodegeeks.com\/?p=2761"},"modified":"2017-02-09T21:31:07","modified_gmt":"2017-02-09T19:31:07","slug":"improving-linux-system-performance-io-scheduler-tuning","status":"publish","type":"post","link":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/","title":{"rendered":"Improving Linux System Performance with I\/O Scheduler Tuning"},"content":{"rendered":"<p>In a previous article, I wrote about <a href=\"https:\/\/blog.codeship.com\/tuning-postgresql-with-pgbench\/\">using pgbench to tune PostgreSQL<\/a>. While I covered a very common tunable <code>shared_buffers<\/code>, there are many other tuning options that can be used to gain performance from PostgreSQL.<\/p>\n<p>Today\u2019s article is going to cover one of those additional options. However, this tunable does not belong to PostgreSQL. Rather this tunable belongs to the Linux Kernel.<\/p>\n<p>In today\u2019s article, we will be adjusting the Linux I\/O scheduler and measuring the impact of those changes with <code>pgbench<\/code>. We will do this using the same PostgreSQL environment we used in the previous article. All of the tuning parameters from the previous article have already been applied to the environment we will be using today.<\/p>\n<h2>What Is an I\/O Scheduler?<\/h2>\n<p>The I\/O Scheduler is an interesting subject; it\u2019s something that\u2019s rarely thought about unless you are trying to get the best performance out of your Linux systems. Before going too deep into how to change the I\/O scheduler, let\u2019s take a moment to better familiarize ourselves with what I\/O schedulers provide.<\/p>\n<p>Disk access has always been considered the slowest method of accessing data. Even with the growing popularity of Flash and Solid State storage, accessing data from disk is considered slower when compared to accessing data from RAM. This is especially true when you have infrastructure that is using spinning disks.<\/p>\n<p>The reason for this is because traditional spinning disks write data based on locations on a spinning platter. When reading data from a spinning disk it is necessary for the physical drive to spin the disk platters to a specific location to read the data. This process is known as \u201cseeking\u201d and in terms of computing, this process can take a long time.<\/p>\n<p>I\/O schedulers exist as a way to optimize disk access requests. They traditionally do this by merging I\/O requests to similar locations on disk. By grouping requests located at similar sections of disk, the drive doesn\u2019t need to \u201cseek\u201d as often, improving the overall response time for disk operations.<\/p>\n<p>On modern Linux implementations, there are several I\/O scheduler options available. Each of these have their own unique method of scheduling disk access requests. In the rest of this article, we will break down how each of these schedulers prioritizes disk access and measure the performance changes from scheduler to scheduler.<\/p>\n<h2>Changing the I\/O Scheduler<\/h2>\n<p>For today\u2019s article, we will be using an Ubuntu Linux server for our tests. With Ubuntu, changing the I\/O Scheduler can be performed at both runtime and on bootup. The method for changing the scheduler at runtime is as simple as changing the value of a file located within <code>\/sys<\/code>. Changing the value on bootup, which allows you to maintain the setting across reboots, will involve changing the Kernel parameters passed via the <strong>Grub<\/strong> boot loader.<\/p>\n<p>Before we change the I\/O scheduler however, let\u2019s first identify our current I\/O scheduler. This can be accomplished by reading the <code>\/sys\/block\/&lt;disk device&gt;\/queue\/scheduler<\/code> file.<\/p>\n<pre class=\"brush:php\"># cat \/sys\/block\/sda\/queue\/scheduler\r\nnoop [deadline] cfq<\/pre>\n<p>The above shows that the I\/O scheduler for disk <code>sda<\/code> is currently set to <code>deadline<\/code>.<\/p>\n<p>One important item to remember is that I\/O scheduling methods are defined at the Linux Kernel level, but they are applied on each disk device separately. If we were to change the value in the file above, this would mean that all filesystems on disk device <code>sda<\/code> will use the new I\/O scheduler.<\/p>\n<p>As with anything performance-tuning related, it is important to understand what types of workloads exist for the environment being tuned. Each I\/O scheduler has a unique way to prioritize disk operations. Understanding the workload required makes it easier to select the right scheduler.<\/p>\n<p>However, like any other performance-tuning change, it is always best to test multiple options and choose based on the results. This is exactly what we will be doing in this article.<\/p>\n<h3>Runtime modification of I\/O scheduler<\/h3>\n<p>As I mentioned earlier, there are two ways to change the I\/O scheduler. You can change the scheduler at runtime, which is applied immediately to a running system, or we can modify the <strong>Grub<\/strong> boot loader\u2019s configuration to apply the scheduler on boot.<\/p>\n<p>Since we will be performing benchmark tests to evaluate which scheduler provides the best results for our PostgreSQL instance, we will start off by changing the scheduler at runtime.<\/p>\n<p>To accomplish this, we simply need to overwrite the <code>\/sys\/block\/&lt;disk device&gt;\/queue\/scheduler<\/code> file with the new I\/O scheduler selection.<\/p>\n<pre class=\"brush:php\"># echo \"cfq\" &gt; \/sys\/block\/sda\/queue\/scheduler\r\n# cat \/sys\/block\/sda\/queue\/scheduler\r\nnoop deadline [cfq]<\/pre>\n<p>From the above, we can see that <code>echo<\/code>ing <code>cfq<\/code> to the <code>\/sys\/block\/sda\/queue\/scheduler<\/code> file changed our current I\/O scheduler to CFQ. This change takes effect immediately. This means we can start testing the scheduler performance without having to restart PostgreSQL or any other service.<\/p>\n<h2>Testing PostgreSQL &amp; I\/O Scheduler Performance<\/h2>\n<p>Since we have already changed the I\/O scheduler to CFQ, we will go ahead and start our testing with the CFQ I\/O scheduler.<\/p>\n<h3>CFQ<\/h3>\n<p>The Complete Fairness Queueing (<strong>CFQ<\/strong>) I\/O scheduler works by creating a per-process I\/O queue. The goal of this I\/O scheduler is to provide a fair I\/O priority to each process. While the CFQ algorithm is complex, the gist of this scheduler is that after ordering the queues to reduce disk seeking, it services these per-process I\/O queues in a round-robin fashion.<\/p>\n<p>What this means for performance is that the CFQ scheduler tries to provide each process with the same priority for disk access. However, in doing so it makes this scheduler less optimal for environments that might need to prioritize one request type (such as reads) from a single process.<\/p>\n<p>With that understanding of the CFQ scheduler, let\u2019s go ahead and establish a benchmark performance metric for our PostgreSQL database instance with <code>pgbench<\/code>.<\/p>\n<pre class=\"brush:php\"># su - postgres<\/pre>\n<p>In order to run <code>pgbench<\/code>, we first need to switch to the <code>postgres<\/code> user. Once there, we can execute the same <code>pgbench<\/code> command executed in our <a href=\"https:\/\/blog.codeship.com\/tuning-postgresql-with-pgbench\/\">previous article<\/a>.<\/p>\n<pre class=\"brush:php\">$ pgbench -c 100 -j 2 -t 1000 example\r\nstarting vacuum...end.\r\ntransaction type: TPC-B (sort of)\r\nscaling factor: 50\r\nquery mode: simple\r\nnumber of clients: 100\r\nnumber of threads: 2\r\nnumber of transactions per client: 1000\r\nnumber of transactions actually processed: 100000\/100000\r\nlatency average: 60.823 ms\r\ntps = 1644.104024 (including connections establishing)\r\ntps = 1644.228715 (excluding connections establishing)<\/pre>\n<p>From the above, we can see that our <strong>tps<\/strong> reached roughly <code>1,644<\/code> transactions per second. While not a bad start, this is not the fastest scheduler for this workload.<\/p>\n<h3>Deadline<\/h3>\n<p>The Deadline scheduler works by creating two queues: a read queue and a write queue. Each I\/O request has a time stamp associated that is used by the kernel for an expiration time.<\/p>\n<p>While this scheduler also attempts to service the queues based on the most efficient ordering possible, the timeout acts as a \u201cdeadline\u201d for each I\/O request. When an I\/O request reaches its deadline, it is pushed to the highest priority.<\/p>\n<p>While tunable, the default \u201cdeadline\u201d values are <code>500<\/code> ms for <strong>Read<\/strong> operations and <code>5,000<\/code> ms for <strong>Write<\/strong> operations. Based on these values, we can see why the Deadline scheduler is considered an optimal scheduler for read-heavy workloads. With these timeout values, the Deadline scheduler may prioritize reads more than writes.<\/p>\n<p>Now that we understand the Deadline scheduler a bit better, let\u2019s go ahead and change to the Deadline scheduler and see how it holds up to our <code>pgbench<\/code> testing.<\/p>\n<pre class=\"brush:php\"># echo deadline &gt; \/sys\/block\/sda\/queue\/scheduler\r\n# cat \/sys\/block\/sda\/queue\/scheduler\r\nnoop [deadline] cfq<\/pre>\n<p>With the above, we can see that our I\/O scheduler is now the Deadline scheduler. Let\u2019s go ahead and run our <code>pgbench<\/code> test again.<\/p>\n<pre class=\"brush:php\"># su - postgres\r\n$ pgbench -c 100 -j 2 -t 1000 example\r\nstarting vacuum...end.\r\ntransaction type: TPC-B (sort of)\r\nscaling factor: 50\r\nquery mode: simple\r\nnumber of clients: 100\r\nnumber of threads: 2\r\nnumber of transactions per client: 1000\r\nnumber of transactions actually processed: 100000\/100000\r\nlatency average: 46.700 ms\r\ntps = 2141.318132 (including connections establishing)\r\ntps = 2141.489076 (excluding connections establishing)<\/pre>\n<p>This time it seems that <code>pgbench<\/code> was able to reach <code>2,141<\/code> transactions per second. This is a <code>500<\/code> transactions-per-second increase, a pretty sizable increase.<\/p>\n<p>What this tells us is that even though <code>pgbench<\/code> is creating a database workload that is both read and write heavy, the overall PostgreSQL instance benefits from a read-priority-based I\/O scheduler.<\/p>\n<h3>Noop<\/h3>\n<p>The Noop scheduler is a unique scheduler. Rather than prioritizing specific I\/O operations, it simply places all I\/O requests into a FIFO (First in, First Out) queue. While this scheduler does try to merge similar requests, that is the extent of the complexity of this scheduler.<\/p>\n<p>This scheduler is optimized for systems that essentially do not need an I\/O scheduler. This scheduler can be used in numerous scenarios such as environments where the underlying disk infrastructure is performing I\/O scheduling on Virtual Machines.<\/p>\n<p>Since a VM is running within a Host Server\/OS, that host already may have an I\/O scheduler in use. In this scenario, each disk operation is passing through two I\/O schedulers: one for the VM and one for the VM Host.<\/p>\n<p>Let\u2019s take a look at what kind of performance Noop has in our environment.<\/p>\n<pre class=\"brush:php\"># echo noop &gt; \/sys\/block\/sda\/queue\/scheduler\r\n# cat \/sys\/block\/sda\/queue\/scheduler\r\n[noop] deadline cfq<\/pre>\n<p>With the above, the scheduler has been changed to the Noop scheduler. We can now run <code>pgbench<\/code> to measure the impact of this I\/O scheduler.<\/p>\n<pre class=\"brush:php\"># su - postgres\r\n$ pgbench -c 100 -j 2 -t 1000 example\r\nstarting vacuum...end.\r\ntransaction type: TPC-B (sort of)\r\nscaling factor: 50\r\nquery mode: simple\r\nnumber of clients: 100\r\nnumber of threads: 2\r\nnumber of transactions per client: 1000\r\nnumber of transactions actually processed: 100000\/100000\r\nlatency average: 46.364 ms\r\ntps = 2156.838618 (including connections establishing)\r\ntps = 2157.102989 (excluding connections establishing)<\/pre>\n<p>From the above, we can see that we were able to reach <code>2,156<\/code> transactions per second. This is only a slightly better performance over the Deadline scheduler. One of the reasons this scheduler may have better performance in our case is because the environment we are testing with is hosted within a VM.<\/p>\n<p>This means that regardless of the changes being made within the VM, the I\/O scheduler in use on the VM host will stay the same.<\/p>\n<h2>Changing the Scheduler on Boot<\/h2>\n<p>Since the Noop scheduler provided quite a bit of improvement over the CFQ scheduler, let\u2019s go ahead and make that change permanent. To do this, we will need to edit the <code>\/etc\/default\/grub<\/code> configuration file.<\/p>\n<pre class=\"brush:php\"># vi \/etc\/default\/grub<\/pre>\n<p>The <code>\/etc\/default\/grub<\/code> configuration file is used to configure the <strong>Grub<\/strong> boot loader. In this case, we will be looking for an option named <code>GRUB_CMDLINE_LINUX<\/code>. This option is used to add kernel boot parameters on startup.<\/p>\n<p>The parameter we need to add is the <code>elevator<\/code> parameter. This is used to specify the desired I\/O scheduler. Let\u2019s go ahead and add the parameter specifying the Noop scheduler.<\/p>\n<pre class=\"brush:php\">GRUB_CMDLINE_LINUX=\"elevator=noop\"<\/pre>\n<p>In the above, we added <code>elevator=noop<\/code>. This is used to define that the I\/O scheduler on boot should be the Noop I\/O scheduler. Once the changes have been made, we will need to run the <code>update-grub2<\/code> command to apply the changed configurations.<\/p>\n<pre class=\"brush:php\"># update-grub2\r\nGenerating grub configuration file ...\r\nFound linux image: \/boot\/vmlinuz-4.4.0-62-generic\r\nFound initrd image: \/boot\/initrd.img-4.4.0-62-generic\r\nFound linux image: \/boot\/vmlinuz-4.4.0-57-generic\r\nFound initrd image: \/boot\/initrd.img-4.4.0-57-generic\r\ndone<\/pre>\n<p>With the <strong>grub<\/strong> configurations applied, we can now <code>reboot<\/code> the system and validate that the changes are still in effect.<\/p>\n<pre class=\"brush:php\"># cat \/sys\/block\/sda\/queue\/scheduler\r\n[noop] deadline cfq<\/pre>\n<h2>Summary<\/h2>\n<p>In this article, we learned about the various I\/O schedulers available on a typical Ubuntu Linux system. We also used <code>pgbench<\/code> to explore the effects these I\/O schedulers have on our PostgreSQL instance.<\/p>\n<p>While our testing showed the Noop scheduler was the most performant for our environment, each environment is different. The type of service being executed and the use of that service can change the performance profile of an environment greatly.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"https:\/\/blog.codeship.com\/linux-io-scheduler-tuning\/\">Improving Linux System Performance with I\/O Scheduler Tuning<\/a> from our <a href=\"http:\/\/www.systemcodegeeks.com\/join-us\/scg\/\">SCG partner<\/a>\u00a0Ben Cane at the <a href=\"http:\/\/blog.codeship.com\/\">Codeship Blog<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In a previous article, I wrote about using pgbench to tune PostgreSQL. While I covered a very common tunable shared_buffers, there are many other tuning options that can be used to gain performance from PostgreSQL. Today\u2019s article is going to cover one of those additional options. However, this tunable does not belong to PostgreSQL. Rather &hellip;<\/p>\n","protected":false},"author":36,"featured_media":192,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-2761","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Improving Linux System Performance with I\/O Scheduler Tuning - System Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"In a previous article, I wrote about using pgbench to tune PostgreSQL. While I covered a very common tunable shared_buffers, there are many other tuning\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Improving Linux System Performance with I\/O Scheduler Tuning - System Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"In a previous article, I wrote about using pgbench to tune PostgreSQL. While I covered a very common tunable shared_buffers, there are many other tuning\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/\" \/>\n<meta property=\"og:site_name\" content=\"System Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/systemcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-10T15:15:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/linux-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ben Cane\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@systemcodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@systemcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ben Cane\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/\"},\"author\":{\"name\":\"Ben Cane\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/86302616000bcfa1e56e85bf9e0fb377\"},\"headline\":\"Improving Linux System Performance with I\/O Scheduler Tuning\",\"datePublished\":\"2017-02-10T15:15:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/\"},\"wordCount\":1761,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/linux-logo.jpg\",\"articleSection\":[\"Linux\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/\",\"url\":\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/\",\"name\":\"Improving Linux System Performance with I\/O Scheduler Tuning - System Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/linux-logo.jpg\",\"datePublished\":\"2017-02-10T15:15:41+00:00\",\"description\":\"In a previous article, I wrote about using pgbench to tune PostgreSQL. While I covered a very common tunable shared_buffers, there are many other tuning\",\"breadcrumb\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#primaryimage\",\"url\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/linux-logo.jpg\",\"contentUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/linux-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.systemcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Linux\",\"item\":\"https:\/\/www.systemcodegeeks.com\/category\/linux\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Improving Linux System Performance with I\/O Scheduler Tuning\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#website\",\"url\":\"https:\/\/www.systemcodegeeks.com\/\",\"name\":\"System Code Geeks\",\"description\":\"Operating System Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.systemcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.systemcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/systemcodegeeks\",\"https:\/\/x.com\/systemcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/86302616000bcfa1e56e85bf9e0fb377\",\"name\":\"Ben Cane\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/58e760dbb7e91f10c242039f23e9c0f2d82f86e5d10798ad76f2a34820fa06d0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/58e760dbb7e91f10c242039f23e9c0f2d82f86e5d10798ad76f2a34820fa06d0?s=96&d=mm&r=g\",\"caption\":\"Ben Cane\"},\"description\":\"Benjamin Cane is a systems architect in the financial services industry. He writes about Linux systems administration on his blog and has recently published his first book, Red Hat Enterprise Linux Troubleshooting Guide.\",\"url\":\"https:\/\/www.systemcodegeeks.com\/author\/ben-cane\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Improving Linux System Performance with I\/O Scheduler Tuning - System Code Geeks - 2026","description":"In a previous article, I wrote about using pgbench to tune PostgreSQL. While I covered a very common tunable shared_buffers, there are many other tuning","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/","og_locale":"en_US","og_type":"article","og_title":"Improving Linux System Performance with I\/O Scheduler Tuning - System Code Geeks - 2026","og_description":"In a previous article, I wrote about using pgbench to tune PostgreSQL. While I covered a very common tunable shared_buffers, there are many other tuning","og_url":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/","og_site_name":"System Code Geeks","article_publisher":"https:\/\/www.facebook.com\/systemcodegeeks","article_published_time":"2017-02-10T15:15:41+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/linux-logo.jpg","type":"image\/jpeg"}],"author":"Ben Cane","twitter_card":"summary_large_image","twitter_creator":"@systemcodegeeks","twitter_site":"@systemcodegeeks","twitter_misc":{"Written by":"Ben Cane","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#article","isPartOf":{"@id":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/"},"author":{"name":"Ben Cane","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/86302616000bcfa1e56e85bf9e0fb377"},"headline":"Improving Linux System Performance with I\/O Scheduler Tuning","datePublished":"2017-02-10T15:15:41+00:00","mainEntityOfPage":{"@id":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/"},"wordCount":1761,"commentCount":2,"publisher":{"@id":"https:\/\/www.systemcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#primaryimage"},"thumbnailUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/linux-logo.jpg","articleSection":["Linux"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/","url":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/","name":"Improving Linux System Performance with I\/O Scheduler Tuning - System Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.systemcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#primaryimage"},"image":{"@id":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#primaryimage"},"thumbnailUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/linux-logo.jpg","datePublished":"2017-02-10T15:15:41+00:00","description":"In a previous article, I wrote about using pgbench to tune PostgreSQL. While I covered a very common tunable shared_buffers, there are many other tuning","breadcrumb":{"@id":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#primaryimage","url":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/linux-logo.jpg","contentUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/linux-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.systemcodegeeks.com\/linux\/improving-linux-system-performance-io-scheduler-tuning\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.systemcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Linux","item":"https:\/\/www.systemcodegeeks.com\/category\/linux\/"},{"@type":"ListItem","position":3,"name":"Improving Linux System Performance with I\/O Scheduler Tuning"}]},{"@type":"WebSite","@id":"https:\/\/www.systemcodegeeks.com\/#website","url":"https:\/\/www.systemcodegeeks.com\/","name":"System Code Geeks","description":"Operating System Developers Resource Center","publisher":{"@id":"https:\/\/www.systemcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.systemcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.systemcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.systemcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/systemcodegeeks","https:\/\/x.com\/systemcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/86302616000bcfa1e56e85bf9e0fb377","name":"Ben Cane","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/58e760dbb7e91f10c242039f23e9c0f2d82f86e5d10798ad76f2a34820fa06d0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/58e760dbb7e91f10c242039f23e9c0f2d82f86e5d10798ad76f2a34820fa06d0?s=96&d=mm&r=g","caption":"Ben Cane"},"description":"Benjamin Cane is a systems architect in the financial services industry. He writes about Linux systems administration on his blog and has recently published his first book, Red Hat Enterprise Linux Troubleshooting Guide.","url":"https:\/\/www.systemcodegeeks.com\/author\/ben-cane\/"}]}},"_links":{"self":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/posts\/2761","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/comments?post=2761"}],"version-history":[{"count":0,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/posts\/2761\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/media\/192"}],"wp:attachment":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/media?parent=2761"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/categories?post=2761"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/tags?post=2761"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}