<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ongkar Dasgupta</title>
    <description>The latest articles on DEV Community by Ongkar Dasgupta (@celestialglitch).</description>
    <link>https://dev.to/celestialglitch</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3831357%2Fa9cbc5f7-b8f4-4443-bdb8-eb94a35b7b09.png</url>
      <title>DEV Community: Ongkar Dasgupta</title>
      <link>https://dev.to/celestialglitch</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/celestialglitch"/>
    <language>en</language>
    <item>
      <title>How does a database know where its data is ?</title>
      <dc:creator>Ongkar Dasgupta</dc:creator>
      <pubDate>Sun, 09 Aug 2026 13:54:52 +0000</pubDate>
      <link>https://dev.to/celestialglitch/how-does-a-database-know-where-its-data-is--50ma</link>
      <guid>https://dev.to/celestialglitch/how-does-a-database-know-where-its-data-is--50ma</guid>
      <description>&lt;p&gt;Recently, a quite an interesting research paper titled &lt;em&gt;&lt;strong&gt;Virtual-Memory Assisted Buffer Management in Tiered Memory&lt;/strong&gt;&lt;/em&gt;, authored by &lt;strong&gt;&lt;em&gt;Yeasir Rayhan and Walid G. Aref&lt;/em&gt;&lt;/strong&gt; came out in the database management ecosystem. Let us discuss about it in this article !&lt;/p&gt;

&lt;p&gt;Instead of quickly summarizing what the authors built and listing their results, it would be great to understand the problem itself. &lt;/p&gt;

&lt;p&gt;Although we won't go into every implementation detail of the paper, we will try to go deep enough to see why each idea becomes necessary. So, please bear with me in this journey. &lt;/p&gt;

&lt;p&gt;We will start from a very ordinary database query, encounter one problem, solve it, see what new problem that solution creates, and keep following the trail. Interestingly, that trail will take us from &lt;em&gt;databases&lt;/em&gt; to &lt;em&gt;RAM&lt;/em&gt;, &lt;em&gt;virtual memory&lt;/em&gt;, &lt;em&gt;page tables&lt;/em&gt;, &lt;em&gt;the TLB&lt;/em&gt;, and eventually even a modification of &lt;em&gt;Linux's page migration mechanism itself&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Let's begin!&lt;/p&gt;

&lt;p&gt;Every time we search for a record, update a value, or run a query on a large database, the processor eventually has to access the corresponding data from somewhere in the machine. Right?&lt;/p&gt;

&lt;p&gt;Quite a substantial portion of this database may be stored persistently on a &lt;em&gt;solid‑state drive (SSD)&lt;/em&gt;, where it can be stored safely for the long term. However, frequent reading from the &lt;em&gt;SSD&lt;/em&gt; would be far too slow. So the  &lt;em&gt;Database Management System (DBMS)&lt;/em&gt;, the software that manages this database, keeps the most frequently accessed data in the computer's main memory (&lt;em&gt;RAM&lt;/em&gt;), where the processor can access it much faster.&lt;/p&gt;

&lt;p&gt;This already creates a very interesting problem. &lt;/p&gt;

&lt;p&gt;A full fledged database contains far more data than what can fit in &lt;em&gt;RAM&lt;/em&gt; all at once. The &lt;em&gt;DBMS&lt;/em&gt; therefore has to keep track of what is currently in RAM, what is still on the &lt;em&gt;SSD&lt;/em&gt;, and where the required data can be found when a database query asks for it. &lt;/p&gt;

&lt;p&gt;Modern servers make this problem even more interesting because there could be additional kinds of memory between these two extremes of &lt;em&gt;RAM&lt;/em&gt; and &lt;em&gt;SSD&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;And this is exactly what we are going to explore -&lt;br&gt;
&lt;strong&gt;&lt;em&gt;How does a DBMS keep track of data as it moves across these different kinds of memory?&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;What are these additional kinds of memory?&lt;br&gt;
In modern servers, memory can be distributed across different hardware locations. There would be two such cases that are particularly relevant in this discussion.&lt;br&gt;
Firstly, servers can contain multiple processor sockets, each holding a CPU package with directly attached main memory, typically &lt;em&gt;DRAM (Dynamic Random-Access Memory)&lt;/em&gt;. From the perspective of a processor running on one socket, its directly attached &lt;em&gt;DRAM&lt;/em&gt; is its &lt;em&gt;local RAM&lt;/em&gt;. It can also access &lt;em&gt;DRAM&lt;/em&gt; attached to another socket, although that access is generally slower.&lt;/p&gt;

&lt;p&gt;Secondly, we have another kind of memory access method called &lt;em&gt;Compute Express Link (CXL)&lt;/em&gt;. &lt;em&gt;CXL&lt;/em&gt; is a high-speed interconnect that allows a processor to access additional memory attached through a &lt;em&gt;CXL&lt;/em&gt; device, rather than limiting it to the &lt;em&gt;RAM&lt;/em&gt; directly attached to the processor itself. One thing to note however is : From the processor's point of view, this additional memory can still be accessed using ordinary memory reads and writes but reaching it generally takes longer than reaching local &lt;em&gt;RAM&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Memory resources of these two kinds including &lt;em&gt;DRAM&lt;/em&gt; attached to another processor socket and CXL-attached memory are broadly referred to in the paper as &lt;em&gt;remote memory (RMem)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So at this moment of study, our &lt;em&gt;DBMS&lt;/em&gt; has quite a lot of choices. Instead of keeping data either in local &lt;em&gt;RAM&lt;/em&gt; or on the much slower &lt;em&gt;SSD&lt;/em&gt;, it can use RMem as an intermediate option. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;How would you connect all of them ?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Simple. Data that is needed very frequently can stay in local &lt;em&gt;RAM&lt;/em&gt;. When local &lt;em&gt;RAM&lt;/em&gt; starts filling up, some data can be moved to &lt;em&gt;RMem&lt;/em&gt; instead of being pushed all the way back to the &lt;em&gt;SSD&lt;/em&gt;. And if that data becomes frequently needed again, it can be moved back into local RAM. &lt;br&gt;
We have essentially gone from a two-level arrangement,' RAM - SSD ', to a three-level management ' RAM - RMem - SSD '.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0bzec9b1ki0wyizp69fp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0bzec9b1ki0wyizp69fp.png" alt="Our 3 level arrangement" width="597" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;But what exactly are we moving between these places?&lt;/strong&gt;&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;A DBMS does not normally move an individual database record every time it needs one (quite obvious!). Instead, it organizes the database into fixed-size chunks called &lt;em&gt;database pages&lt;/em&gt;. A page can contain multiple records, and each page is identified by a &lt;em&gt;Page Identifier (PID)&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;So when a query eventually needs some data, the &lt;em&gt;DBMS&lt;/em&gt; first needs the corresponding page. And because that page could now be in local &lt;em&gt;RAM&lt;/em&gt;, somewhere in &lt;em&gt;RMem&lt;/em&gt;, or only on the &lt;em&gt;SSD&lt;/em&gt;, we finally arrive at a more technical version of the problem we started with in our title: &lt;br&gt;
&lt;em&gt;&lt;strong&gt;given a PID, how does the DBMS efficiently find where its page currently is?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One straightforward way is to maintain a &lt;em&gt;Hash Table&lt;/em&gt; inside the &lt;em&gt;DBMS&lt;/em&gt;. We can think of it as a lookup structure where the &lt;em&gt;DBMS&lt;/em&gt; stores an entry connecting each page currently kept in memory to the address through which that page can be accessed. In simplified form, it looks something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PID 42 → memory address X&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now suppose a query needs &lt;em&gt;Page 42&lt;/em&gt;. The DBMS cannot simply access &lt;em&gt;Page 42&lt;/em&gt; directly. It first takes &lt;em&gt;PID 42&lt;/em&gt;, searches the &lt;em&gt;Hash Table&lt;/em&gt;, obtains 'X', and only then accesses the page through that address. So before reaching the actual database page, we have introduced an additional lookup:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PID → Hash Table → memory address → actual page&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The issue here is that page accesses happen continuously while a database is serving queries. At large scale, repeatedly searching this &lt;em&gt;Hash Table&lt;/em&gt; introduces additional costs for the processor. &lt;br&gt;
This raises our next question in this journey: &lt;strong&gt;&lt;em&gt;if the purpose of the Hash Table is ultimately to translate a page identifier into a memory address, does the DBMS really need to perform that translation itself?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Well, it goes like our computer already has another mechanism whose entire job involves translating addresses: &lt;strong&gt;virtual memory&lt;/strong&gt; !&lt;/p&gt;

&lt;p&gt;When a program uses a memory address, that address is generally not the actual physical location of the data inside a &lt;em&gt;RAM&lt;/em&gt; chip. Instead, the program works with a virtual address.&lt;/p&gt;

&lt;p&gt;The processor translates this virtual address into a physical address using mappings maintained by the operating system in a structure called the &lt;em&gt;Page Table&lt;/em&gt;. In a simplified form, we have something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;virtual address X → Page Table → physical location A&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why introduce this extra layer at all?&lt;/strong&gt; Because now the address visible to a program and the actual physical location of its data no longer have to be the same thing. &lt;/p&gt;

&lt;p&gt;Suppose some data currently lives at physical location A and the program accesses it through virtual address X. If the operating system later moves that data to physical location B, it can simply update the mapping:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;X → A&lt;br&gt;
becomes&lt;br&gt;
X → B&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The program can still continue accessing X exactly as before. It does not need to know that the physical location underneath X has changed. And this gives us a very interesting possibility for our next database problem: &lt;strong&gt;&lt;em&gt;What if a database page could similarly keep one fixed virtual address even while its actual physical location changes?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is exactly the idea behind an earlier system called &lt;em&gt;vmcache&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Instead of maintaining a &lt;em&gt;Hash Table&lt;/em&gt; that repeatedly tells the &lt;em&gt;DBMS&lt;/em&gt; where each database page is located, &lt;em&gt;vmcache&lt;/em&gt; reserves a large range of virtual addresses and gives every database page its own fixed virtual address. &lt;/p&gt;

&lt;p&gt;Suppose Page 42 is assigned virtual address X. That relationship does not change during the lifetime of the page:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PID 42 → virtual address X&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If Page 42 is currently present in RAM, the OS Page Table takes care of the remaining translation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PID 42 → virtual address X → Page Table → physical location A&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;em&gt;Hash Table&lt;/em&gt; lookup issue is solved ! The &lt;em&gt;DBMS&lt;/em&gt; knows the fixed virtual address associated with the page, while the operating system's existing &lt;em&gt;Page Table&lt;/em&gt; tells the processor where the page actually resides in physical memory ( there are two different scopes now !).&lt;/p&gt;

&lt;p&gt;But what happens if Page 42 is not in &lt;em&gt;RAM&lt;/em&gt; at all and currently exists only on the &lt;em&gt;SSD&lt;/em&gt;? There would be no valid physical RAM location for X to point to. When the program tries to access X, the processor detects that the required page is not currently present in memory and triggers what is called a &lt;em&gt;page fault&lt;/em&gt;. This transfers control to the operating system, allowing &lt;em&gt;vmcache&lt;/em&gt; to bring the required database page from the SSD into RAM. Once loaded, the OS installs the corresponding virtual-to-physical mapping, and access can continue.&lt;/p&gt;

&lt;p&gt;So &lt;em&gt;vmcache&lt;/em&gt; already gives us an elegant solution when there are two levels RAM, followed by, SSD. &lt;br&gt;
But &lt;em&gt;Modern servers may also have _RMem&lt;/em&gt; sitting between them._&lt;/p&gt;

&lt;p&gt;Now Page 42 does not simply have two possibilities, “in RAM” or “on SSD.” It may move like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;local RAM → RMem → local RAM → RMem → SSD&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And this leads directly to the question investigated in the paper we are discussing: &lt;strong&gt;&lt;em&gt;Can the fixed-virtual-address idea of vmcache still work when the physical page is continuously moving across multiple memory tiers?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The authors extend &lt;em&gt;vmcache&lt;/em&gt; for exactly this setting and call the resulting system &lt;em&gt;vmcacheⁿ&lt;/em&gt;, where the &lt;em&gt;n&lt;/em&gt; represents the possibility of having multiple memory tiers.&lt;/p&gt;

&lt;p&gt;They preserve the same fundamental idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The virtual address of a database page remains fixed throughout its lifetime, while the physical memory backing that address is allowed to change.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjayuj7nhayu3vxgy8w5b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjayuj7nhayu3vxgy8w5b.png" alt="The central idea of vmcacheⁿ " width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sounds like our problem is solved then?&lt;/p&gt;

&lt;p&gt;Not quite. We have decided that the virtual address will remain fixed, but the actual page may still have to move between local RAM and RMem. If Page 42 is currently in local RAM and the DBMS decides that it should now reside in RMem, &lt;strong&gt;something still has to physically move that page from one memory tier to the other and change the mapping underneath its fixed virtual address.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;To move Page 42 from local RAM to RMem, vmcacheⁿ needs to move the actual contents of that page to a physical location in RMem and then update the Page Table so that X points to this new location. The virtual address remains unchanged throughout this process. This movement of a page from one physical memory location to another is called &lt;strong&gt;page migration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Linux already provides a system call called &lt;strong&gt;move_pages&lt;/strong&gt; for doing exactly this. vmcacheⁿ can give it a collection of pages along with the memory location where each should be moved. Linux performs the migrations and updates their Page Table mappings, while their virtual addresses remain unchanged. Even better, &lt;em&gt;&lt;strong&gt;move_pages&lt;/strong&gt;&lt;/em&gt; can migrate multiple pages in one call rather than requiring a separate request for every page.&lt;/p&gt;

&lt;p&gt;Our next problem got itself introduced here!&lt;/p&gt;

&lt;p&gt;Remember that the processor needs the Page Table to translate virtual addresses such as X into physical locations. Looking up the Page Table for every memory access would itself be slow, so processors keep recently used translations in a small and extremely fast cache called the &lt;strong&gt;Translation Lookaside Buffer (TLB)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Suppose the processor has cached:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;X → physical location A&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;vmcacheⁿ now migrates our page to RMem and the Page Table becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;X → physical location B&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Page Table is correct, but the processor may still have the old X → A translation sitting in its TLB. That cached entry must therefore be invalidated before the new mapping can safely be used. And if several processor cores have cached the same translation, the operating system may need to make all of them discard it. This operation is known as a &lt;strong&gt;TLB shootdown&lt;/strong&gt;, and it is expensive because it can require interrupts between processor cores.&lt;/p&gt;

&lt;p&gt;Now imagine vmcacheⁿ continuously moving large numbers of database pages between local RAM and RMem. These invalidations start adding up. Linux's &lt;strong&gt;move_pages&lt;/strong&gt; already groups page migrations into batches, but by default it processes at most 512 pages in a migration batch. The authors realized that if more pages could be migrated together, the cost of TLB invalidation could be spread across a larger number of page movements.&lt;/p&gt;

&lt;p&gt;This observation led them to modify the Linux page-migration interface itself. They introduced a new system call called &lt;strong&gt;move_pages2&lt;/strong&gt;, which lets &lt;em&gt;vmcacheⁿ&lt;/em&gt; control how many pages are grouped into a migration batch. It also handles failures more flexibly. Instead of certain errors on one page which makes the remaining pages in the request to be skipped, &lt;strong&gt;move_pages2&lt;/strong&gt; can record that failure and continue attempting the other eligible migrations.&lt;/p&gt;

&lt;p&gt;And surprisingly, implementing &lt;strong&gt;move_pages2&lt;/strong&gt; required only about 150 lines of changes across four Linux kernel functions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Our question now is: does all of this actually make the database faster?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To find out, the researchers used a server with &lt;em&gt;two processor sockets&lt;/em&gt;. RAM attached to the processor running the workload acted as &lt;em&gt;local RAM&lt;/em&gt;, RAM attached to the other socket acted as &lt;em&gt;RMem&lt;/em&gt;, and a 960 GB NVMe SSD formed the final storage tier. So their experimental machine essentially gave them the same hierarchy we have been discussing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Local RAM → RMem → SSD&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The amount of local &lt;em&gt;RAM&lt;/em&gt; was restricted to only 32 GB, forcing the system to decide what stays locally, what moves to &lt;em&gt;RMem&lt;/em&gt;, and what eventually has to be obtained from the SSD.&lt;/p&gt;

&lt;p&gt;The researchers then used two workloads. The first was &lt;strong&gt;TPC-C&lt;/strong&gt;, a standard benchmark that simulates transactions performed by a real database system, such as placing orders and processing payments. The second was a &lt;strong&gt;random-read workload&lt;/strong&gt;, where the system repeatedly requested data scattered across a large dataset. TPC-C shows whether &lt;em&gt;vmcacheⁿ&lt;/em&gt; improves the system as a whole, while random reads make page migration between local RAM and RMem much more prominent, allowing &lt;em&gt;move_pages2&lt;/em&gt; to be examined more directly.&lt;/p&gt;

&lt;p&gt;Let's focus on &lt;em&gt;TPC-C&lt;/em&gt; first.&lt;/p&gt;

&lt;p&gt;With TPC-C, &lt;em&gt;&lt;strong&gt;vmcacheⁿ achieved 1.67× higher throughput than vmcache with 2× RMem, increasing to 3.82× with 4× RMem&lt;/strong&gt;&lt;/em&gt;. More pages could remain in &lt;em&gt;RMem&lt;/em&gt; instead of requiring slower SSD accesses.&lt;/p&gt;

&lt;p&gt;But this improvement came from &lt;em&gt;vmcacheⁿ&lt;/em&gt; as a whole, not specifically from move_pages2. For TPC-C, &lt;em&gt;move_pages2&lt;/em&gt; performed similarly to the existing &lt;em&gt;move_pages&lt;/em&gt; because SSD accesses still accounted for a substantial part of the workload.&lt;/p&gt;

&lt;p&gt;The difference became clearer with random reads, where movement between local RAM and RMem mattered much more. Here, &lt;em&gt;move_pages2&lt;/em&gt; achieved &lt;strong&gt;1.42× higher query throughput and 1.32× higher page-migration throughput&lt;/strong&gt; than &lt;em&gt;move_pages&lt;/em&gt;. Its larger migration batches allowed the cost of &lt;strong&gt;TLB invalidation&lt;/strong&gt; to be spread across more page movements.&lt;/p&gt;

&lt;p&gt;However, the experiments revealed one important limitation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Adding RMem does not automatically make the database faster.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Moving pages between local &lt;em&gt;RAM&lt;/em&gt; and &lt;em&gt;RMem&lt;/em&gt; has a cost of its own. When RMem was small, this migration overhead could outweigh the benefit of avoiding SSD accesses. As RMem capacity increased, keeping more pages in memory became increasingly worth the cost of moving them.&lt;/p&gt;

&lt;p&gt;And that finally gives us an answer to the question we started with:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;How does a DBMS keep track of data as it moves across different kinds of memory?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In &lt;em&gt;vmcacheⁿ&lt;/em&gt;, the &lt;em&gt;DBMS&lt;/em&gt; does not need to explicitly translate each &lt;em&gt;PID&lt;/em&gt; into its changing physical address. Each database page is given a fixed virtual address, while the operating system's &lt;em&gt;Page Table&lt;/em&gt; keeps track of which physical memory currently backs that address. The page may move from local RAM to RMem and later back again, but the address used by the DBMS remains unchanged.&lt;/p&gt;

&lt;p&gt;The authors then solve the second problem created by this approach: moving those physical pages efficiently. Their move_pages2 system call gives &lt;em&gt;vmcacheⁿ&lt;/em&gt; greater control over how migrations are batched, helping minimise costs such as TLB invalidation when page migration becomes a major part of the workload.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The interesting idea behind this paper is that the researchers did not eliminate the cost of managing data across different memory speeds. They moved part of the tracking problem to a mechanism the computer already has, and then identified page migration as the new bottleneck created by that decision.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paper Reference:&lt;/strong&gt; Rayhan, Yeasir, and Walid G. Aref. "Virtual-Memory Assisted Buffer Management In Tiered Memory." In Proceedings of the 22nd International Workshop on Data Management on New Hardware, pp. 1-5. 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paper Link:&lt;/strong&gt; &lt;a href="https://arxiv.org/abs/2603.03271" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2603.03271&lt;/a&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>computerarchitecture</category>
      <category>computerscience</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Trying to solve a frustrating problem: why is debugging AI systems still so unclear?</title>
      <dc:creator>Ongkar Dasgupta</dc:creator>
      <pubDate>Wed, 18 Mar 2026 11:50:59 +0000</pubDate>
      <link>https://dev.to/celestialglitch/trying-to-solve-a-frustrating-problem-why-is-debugging-ai-systems-still-so-unclear-1mbp</link>
      <guid>https://dev.to/celestialglitch/trying-to-solve-a-frustrating-problem-why-is-debugging-ai-systems-still-so-unclear-1mbp</guid>
      <description>&lt;p&gt;I’ve been thinking about something that keeps coming up when working with AI systems. When a model gives a wrong or weird output, it’s surprisingly hard to figure out what actually went wrong. Most of the time we’re digging through logs &lt;br&gt;
or guessing where things broke.&lt;br&gt;
As part of the AWS AI Ideas hackathon, I started building a concept called AutopsyAI. The idea is to look at the full pipeline from input to output and try to explain where things might have failed, instead of just showing the final result. It’s still early and not a full product yet, more like an attempt to explore whether this problem is worth solving in a structured way.&lt;br&gt;
Curious how others here deal with this. If you’ve worked with AI systems in production, how do you debug failures today? Does this feel like a real problem, or is it already solved better than I think?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fah2zxs9z8hw5t65ef44w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fah2zxs9z8hw5t65ef44w.jpg" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please do checkout my article and support it!&lt;br&gt;
&lt;a href="https://builder.aws.com/content/3AeXXMtLdDuPwRL4xcEjJEBoQkB/aideas-autopsyai-the-missing-debugger-for-ai-systems" rel="noopener noreferrer"&gt;https://builder.aws.com/content/3AeXXMtLdDuPwRL4xcEjJEBoQkB/aideas-autopsyai-the-missing-debugger-for-ai-systems&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>development</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
