diff --git a/CHANGELOG.md b/CHANGELOG.md
index 57c5be5747ddb62c9d62bdf071408849c093ffe0..b9f05455b9aa2079a2d38c5133bfa2116bf2475a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -23,6 +23,8 @@ with the `YY.MINOR.MICRO` scheme.
 - New parameters for Vinyl configuration: `bloom_fpr`, `max_tuple_size`, `page_size`, `range_size`,
   `run_count_per_size`, `run_size_ratio`, `read_threads`, `write_threads` and `timeout`.
 
+- New parameter for Memtx configuration: `max_tuple_size`.
+
 - `plugin_dir` parameter is renamed to `share_dir` (--plugin-dir -> --share-dir,
   PICODATA_PLUGIN_DIR -> PICODATA_SHARE_DIR, config: instance.plugin_dir ->
   instance.share_dir)
diff --git a/src/cli/args.rs b/src/cli/args.rs
index 7577e169790a662e441f1c33dd3872ff2793a676..75e3ae755d537163e16274b5ad82cca3d9dda6f2 100644
--- a/src/cli/args.rs
+++ b/src/cli/args.rs
@@ -301,6 +301,12 @@ pub struct Run {
     /// By default, 64 MiB is used.
     pub memtx_memory: Option<ByteSize>,
 
+    #[clap(long = "memtx-max-tuple-size", env = "PICODATA_MEMTX_MAX_TUPLE_SIZE")]
+    /// Size of the largest allocation unit, for the memtx storage engine
+    ///
+    /// By default, 1 MiB is used.
+    pub memtx_max_tuple_size: Option<ByteSize>,
+
     #[clap(hide = true, long = "entrypoint-fd")]
     /// A pipe file descriptor from which picodata reads the entrypoint info
     /// when doing a rebootstrap during the cluster initialization.
diff --git a/src/config.rs b/src/config.rs
index 886db575eb3604270f9202f88d7d932436a30c11..c9bc8e200ba63a9206103674bc4315d72ba7ddff 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -350,6 +350,10 @@ Using configuration file '{args_path}'.");
             config_from_args.instance.memtx.memory = Some(memtx_memory);
         }
 
+        if let Some(memtx_max_tuple_size) = args.memtx_max_tuple_size {
+            config_from_args.instance.memtx.max_tuple_size = Some(memtx_max_tuple_size);
+        }
+
         // --config-parameter has higher priority than other command line
         // arguments as a side effect of the fact that clap doesn't tell us
         // where the value came from: cli or env. Because we want
@@ -1382,6 +1386,12 @@ pub struct MemtxSection {
     /// Corresponds to `box.cfg.memtx_memory`.
     #[introspection(config_default = "64M")]
     pub memory: Option<ByteSize>,
+
+    /// Memory limit for one tuple.
+    ///
+    /// Corresponds to `box.cfg.memtx_max_tuple_size`.
+    #[introspection(config_default = "1M")]
+    pub max_tuple_size: Option<ByteSize>,
 }
 
 tarantool::define_str_enum! {
@@ -2470,11 +2480,13 @@ instance:
             let config = setup_for_tests(Some(yaml), &["run",
                 "-c", "  instance.log .level =debug  ",
                 "--config-parameter", "instance. memtx . memory=  999",
+                "--config-parameter", "instance. memtx . max_tuple_size=  998",
             ]).unwrap();
             assert_eq!(config.instance.tier.unwrap(), "ABC");
             assert_eq!(config.cluster.name.unwrap(), "DEF");
             assert_eq!(config.instance.log.level.unwrap(), args::LogLevel::Debug);
             assert_eq!(config.instance.memtx.memory.unwrap().to_string(), String::from("999B"));
+            assert_eq!(config.instance.memtx.max_tuple_size.unwrap().to_string(), String::from("998B"));
             assert_eq!(config.instance.audit.unwrap(), "audit.txt");
             assert_eq!(config.instance.instance_dir.unwrap(), PathBuf::from("."));
 
diff --git a/src/tarantool.rs b/src/tarantool.rs
index db42dae36a6b02494899ae76ec36f0fdfed2899e..e18be926574d8c6aa92ac99ea235779422ae9e5c 100644
--- a/src/tarantool.rs
+++ b/src/tarantool.rs
@@ -322,6 +322,7 @@ impl Cfg {
         #[rustfmt::skip]
         const BYTESIZE_FIELDS: &[(&str, &str)] = &[
             ("memtx_memory",                config_parameter_path!(instance.memtx.memory)),
+            ("memtx_max_tuple_size",        config_parameter_path!(instance.memtx.max_tuple_size)),
             ("vinyl_memory",                config_parameter_path!(instance.vinyl.memory)),
             ("vinyl_cache",                 config_parameter_path!(instance.vinyl.cache)),
             ("vinyl_max_tuple_size",        config_parameter_path!(instance.vinyl.max_tuple_size)),
diff --git a/test/int/test_config_file.py b/test/int/test_config_file.py
index f6374ffb1ff390bde2ff90fa5d78855c19773d2b..fef22385686a2093a3f198f9d169f85937734ad1 100644
--- a/test/int/test_config_file.py
+++ b/test/int/test_config_file.py
@@ -18,6 +18,7 @@ instance:
 
     memtx:
         memory: 42069
+        max_tuple_size: 10485760
 """
     )
     instance = cluster.add_instance(wait_online=False)
@@ -29,6 +30,7 @@ instance:
     assert info["replicaset_name"] == "with-love"
 
     assert instance.eval("return box.cfg.memtx_memory") == 42069
+    assert instance.eval("return box.cfg.memtx_max_tuple_size") == 10485760
 
 
 def test_pico_config(cluster: Cluster, port_distributor: PortDistributor):
@@ -103,6 +105,7 @@ instance:
             peer=dict(value=[f"{host}:{port}"], source="config_file"),
             memtx=dict(
                 memory=dict(value="64M", source="default"),
+                max_tuple_size=dict(value="1M", source="default"),
             ),
             vinyl=dict(
                 memory=dict(value="128M", source="default"),