mirror of
https://github.com/elastic/elasticsearch.git
synced 2025-06-28 09:28:55 -04:00
Turn direct IO for BBQ rescoring off by default (#130014)
Add a changelog entry for direct io option
This commit is contained in:
parent
77b459c454
commit
ff65fd1133
5 changed files with 27 additions and 2 deletions
18
docs/changelog/125921.yaml
Normal file
18
docs/changelog/125921.yaml
Normal 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: []
|
|
@ -17,6 +17,7 @@ import org.apache.lucene.store.IOContext;
|
||||||
import org.apache.lucene.store.IndexOutput;
|
import org.apache.lucene.store.IndexOutput;
|
||||||
import org.apache.lucene.tests.util.LuceneTestCase;
|
import org.apache.lucene.tests.util.LuceneTestCase;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.index.codec.vectors.es818.ES818BinaryQuantizedVectorsFormat;
|
||||||
import org.elasticsearch.plugins.Plugin;
|
import org.elasticsearch.plugins.Plugin;
|
||||||
import org.elasticsearch.search.vectors.KnnSearchBuilder;
|
import org.elasticsearch.search.vectors.KnnSearchBuilder;
|
||||||
import org.elasticsearch.search.vectors.VectorData;
|
import org.elasticsearch.search.vectors.VectorData;
|
||||||
|
@ -43,7 +44,9 @@ import static org.hamcrest.Matchers.is;
|
||||||
public class DirectIOIT extends ESIntegTestCase {
|
public class DirectIOIT extends ESIntegTestCase {
|
||||||
|
|
||||||
@BeforeClass
|
@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");
|
Path path = createTempDir("directIOProbe");
|
||||||
try (Directory dir = open(path); IndexOutput out = dir.createOutput("out", IOContext.DEFAULT)) {
|
try (Directory dir = open(path); IndexOutput out = dir.createOutput("out", IOContext.DEFAULT)) {
|
||||||
out.writeString("test");
|
out.writeString("test");
|
||||||
|
|
|
@ -87,7 +87,7 @@ import static org.elasticsearch.index.mapper.vectors.DenseVectorFieldMapper.MAX_
|
||||||
*/
|
*/
|
||||||
public class ES818BinaryQuantizedVectorsFormat extends FlatVectorsFormat {
|
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 BINARIZED_VECTOR_COMPONENT = "BVEC";
|
||||||
public static final String NAME = "ES818BinaryQuantizedVectorsFormat";
|
public static final String NAME = "ES818BinaryQuantizedVectorsFormat";
|
||||||
|
|
|
@ -333,6 +333,8 @@ public class ES818BinaryQuantizedVectorsFormatTests extends BaseKnnVectorsFormat
|
||||||
}
|
}
|
||||||
|
|
||||||
static void checkDirectIOSupported() {
|
static void checkDirectIOSupported() {
|
||||||
|
assumeTrue("Direct IO is not enabled", ES818BinaryQuantizedVectorsFormat.USE_DIRECT_IO);
|
||||||
|
|
||||||
Path path = createTempDir("directIOProbe");
|
Path path = createTempDir("directIOProbe");
|
||||||
try (Directory dir = open(path); IndexOutput out = dir.createOutput("out", IOContext.DEFAULT)) {
|
try (Directory dir = open(path); IndexOutput out = dir.createOutput("out", IOContext.DEFAULT)) {
|
||||||
out.writeString("test");
|
out.writeString("test");
|
||||||
|
|
|
@ -221,6 +221,8 @@ public class ES818HnswBinaryQuantizedVectorsFormatTests extends BaseKnnVectorsFo
|
||||||
}
|
}
|
||||||
|
|
||||||
static void checkDirectIOSupported() {
|
static void checkDirectIOSupported() {
|
||||||
|
assumeTrue("Direct IO is not enabled", ES818BinaryQuantizedVectorsFormat.USE_DIRECT_IO);
|
||||||
|
|
||||||
Path path = createTempDir("directIOProbe");
|
Path path = createTempDir("directIOProbe");
|
||||||
try (Directory dir = open(path); IndexOutput out = dir.createOutput("out", IOContext.DEFAULT)) {
|
try (Directory dir = open(path); IndexOutput out = dir.createOutput("out", IOContext.DEFAULT)) {
|
||||||
out.writeString("test");
|
out.writeString("test");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue