When Virtuoso is started, it checks the
Striping parameter in the
[Database] section of the
virtuoso.ini configuration file to see whether it’s a “normal” single database file, or a Striped set of database files should be created. When
Striping = 1, Virtuoso then looks to the
[Striping] section, checks whether the segments defined there already exist, and creates them if not.
For example, consider the following entries in a
virtuoso.ini configuration file:
[Database] FileExtend = 20000 Striping = 1 [Striping] Segment1 = 100M, /data1/virtuoso-1.db = ioq1 , /data2/virtuoso-2.db = ioq2 , /data3/virtuoso-3.db = ioq3 , /data4/virtuoso-4.db = ioq4 , /data5/virtuoso-5.db = ioq5 , /data6/virtuoso-6.db = ioq6 , /data7/virtuoso-7.db = ioq7
On first start, Virtuoso detects that the database stripes do not exist yet, so it looks at the initial size of the database which is here set to
100M; that is,
100MB * 1024KB/MB * 1024B/KB = 104,857,600 bytes.
Virtuoso has a default
8192 bytes, so this means
104,857,600B ÷ 8192B/PAGE = 12,800 pages.
When using multiple stripes, Virtuoso requires that the number of pages be evenly divisible by
EXTENT_SZ * number of stripes. With
EXTENT_SZ = 256 and the number of stripes = 7, the divisor is calculated to be
256 * 7 = 1792. However,
12,800 ÷ 1792 = 7.142 which is not a whole number — i.e., the division is not even — so Virtuoso increases the page count to be based on the next-higher multiplier; that is,
1792 * 8 = 14,336 pages.
In the log, Virtuoso then reports it created a slightly bigger initial database, and proceeds to create the 7 stripes for the database, with
14,336 ÷ 7 = 2048 pages per stripe, and continues on to initialize the database, etc.
If and when all the free pages in the database get filled with data, Virtuoso will “grow” the database with the
20000) number of pages — or actually,
21,504 pages, that being the nearest multiple of the divisor calculated earlier (
Note that if the rough size of the database to be created is known, the first attribute of the
Segment1 param in the
[Striping] section of the
100M, above) should be set to this size. The Virtuoso striped database will then be initialized at that size, and Virtuoso will not have to periodically halt all threads and “grow” the database to obtain free pages as the data is loaded, until the initial “fully-loaded” size is reached.