Turn direct IO for BBQ rescoring off by default (#130014)

Add a changelog entry for direct io option
This commit is contained in:
Simon Cooper 2025-06-27 08:31:20 +01:00 committed by GitHub
parent 77b459c454
commit ff65fd1133
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 27 additions and 2 deletions

View file

@ -0,0 +1,18 @@
pr: 125921
summary: Allow direct IO for BBQ rescoring
area: Vector Search
type: feature
highlight:
title: Allow direct IO for BBQ rescoring
body: |-
BBQ rescoring performance can be drastically affected by the amount of available
off-heap RAM for use by the system page cache. When there is not enough off-heap RAM
to fit all the vector data in memory, BBQ search latencies can be affected by as much as 5000x.
Specifying the `vector.rescoring.directio=true` Java option on all vector search
nodes modifies rescoring to use direct IO, which eliminates these very high latencies
from searches in low-memory scenarios, at a cost of a reduction
in vector search performance for BBQ indices when the vectors do all fit in memory.
This option is released in 9.1 as a tech preview whilst we analyse its effect
for a variety of use cases.
issues: []

View file

@ -17,6 +17,7 @@ import org.apache.lucene.store.IOContext;
import org.apache.lucene.store.IndexOutput;
import org.apache.lucene.tests.util.LuceneTestCase;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.codec.vectors.es818.ES818BinaryQuantizedVectorsFormat;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.search.vectors.KnnSearchBuilder;
import org.elasticsearch.search.vectors.VectorData;
@ -43,7 +44,9 @@ import static org.hamcrest.Matchers.is;
public class DirectIOIT extends ESIntegTestCase {
@BeforeClass
public static void checkSupported() throws IOException {
public static void checkSupported() {
assumeTrue("Direct IO is not enabled", ES818BinaryQuantizedVectorsFormat.USE_DIRECT_IO);
Path path = createTempDir("directIOProbe");
try (Directory dir = open(path); IndexOutput out = dir.createOutput("out", IOContext.DEFAULT)) {
out.writeString("test");

View file

@ -87,7 +87,7 @@ import static org.elasticsearch.index.mapper.vectors.DenseVectorFieldMapper.MAX_
*/
public class ES818BinaryQuantizedVectorsFormat extends FlatVectorsFormat {
static final boolean USE_DIRECT_IO = Boolean.parseBoolean(System.getProperty("vector.rescoring.directio", "true"));
public static final boolean USE_DIRECT_IO = Boolean.parseBoolean(System.getProperty("vector.rescoring.directio", "false"));
public static final String BINARIZED_VECTOR_COMPONENT = "BVEC";
public static final String NAME = "ES818BinaryQuantizedVectorsFormat";

View file

@ -333,6 +333,8 @@ public class ES818BinaryQuantizedVectorsFormatTests extends BaseKnnVectorsFormat
}
static void checkDirectIOSupported() {
assumeTrue("Direct IO is not enabled", ES818BinaryQuantizedVectorsFormat.USE_DIRECT_IO);
Path path = createTempDir("directIOProbe");
try (Directory dir = open(path); IndexOutput out = dir.createOutput("out", IOContext.DEFAULT)) {
out.writeString("test");

View file

@ -221,6 +221,8 @@ public class ES818HnswBinaryQuantizedVectorsFormatTests extends BaseKnnVectorsFo
}
static void checkDirectIOSupported() {
assumeTrue("Direct IO is not enabled", ES818BinaryQuantizedVectorsFormat.USE_DIRECT_IO);
Path path = createTempDir("directIOProbe");
try (Directory dir = open(path); IndexOutput out = dir.createOutput("out", IOContext.DEFAULT)) {
out.writeString("test");