已开启
dbmind 的xtuner子功能中的recommend运行模式推荐结果新增一列:参数的当前值 #152
AtomGit-Bot创建于 2023年8月3日
dbmind 的xtuner子功能中的recommend运行模式推荐结果新增一列:参数的当前值 #152
已开启
从refs/pull/152/head合入到master
共 3 个文件变更+49-8
| @@ -302,7 +302,7 @@ class DriverBundle: | |||
| 302 | ) | 302 | ) |
| 303 | discovered = set() | 303 | discovered = set() |
| 304 | for dbname in all_db_list: | 304 | for dbname in all_db_list: |
| 305 | - if dbname in ('template0', 'template1'): # Skip these useless databases. | 305 | + if dbname[0] in ('template0', 'template1'): # Skip these useless databases. |
| 306 | continue | 306 | continue |
| 307 | discovered.add(dbname[0]) | 307 | discovered.add(dbname[0]) |
| 308 | 308 | ||
| @@ -51,12 +51,13 @@ class RecommendedKnobs: | |||
| 51 | print(construct_dividing_line('Recommended Knob Settings', padding='*')) | 51 | print(construct_dividing_line('Recommended Knob Settings', padding='*')) |
| 52 | 52 | ||
| 53 | knob_table = PrettyTable() | 53 | knob_table = PrettyTable() |
| 54 | - knob_table.field_names = ['name', 'recommend', 'min', 'max', 'restart'] | 54 | + knob_table.field_names = ['name', 'recommend', 'min', 'max', 'current', 'restart'] |
| 55 | 55 | ||
| 56 | for knob in self.all_knobs: | 56 | for knob in self.all_knobs: |
| 57 | - knob_table.add_row( | 57 | + if knob.recommend != knob.current_value: # Only parameters whose recommended value differs from the current value are displayed. |
| 58 | - (knob.name, knob.recommend, knob.min, knob.max, knob.restart) | 58 | + knob_table.add_row( |
| 59 | - ) | 59 | + (knob.name, knob.recommend, knob.min, knob.max, knob.current_value, knob.restart) |
| 60 | + ) | ||
| 60 | print(knob_table) | 61 | print(knob_table) |
| 61 | 62 | ||
| 62 | def dump(self, fp, dump_report_knobs=True): | 63 | def dump(self, fp, dump_report_knobs=True): |
| @@ -116,6 +117,8 @@ class Knob: | |||
| 116 | original: Str type. A setting value from `pg_settings` or user's configuration. | 117 | original: Str type. A setting value from `pg_settings` or user's configuration. |
| 117 | min: Optional. Int, float type. | 118 | min: Optional. Int, float type. |
| 118 | max: Optional. Int, float type. | 119 | max: Optional. Int, float type. |
| 120 | + current_value: Optional. Int, float type. | ||
| 121 | + current: Optional. Int, float type. | ||
| 119 | type: String type. Constrained by Knob.TYPE. | 122 | type: String type. Constrained by Knob.TYPE. |
| 120 | restart: Boolean type. | 123 | restart: Boolean type. |
| 121 | 124 | ||
| @@ -126,6 +129,7 @@ class Knob: | |||
| 126 | self.recommend = kwargs.get('recommend') | 129 | self.recommend = kwargs.get('recommend') |
| 127 | self.original = self.current = None | 130 | self.original = self.current = None |
| 128 | self.user_set = kwargs.get('default') | 131 | self.user_set = kwargs.get('default') |
| 132 | + self.current_value = kwargs.get('current') | ||
| 129 | self._min = kwargs.get('min') | 133 | self._min = kwargs.get('min') |
| 130 | self._max = kwargs.get('max') | 134 | self._max = kwargs.get('max') |
| 131 | self.type = kwargs.get('type') | 135 | self.type = kwargs.get('type') |
| @@ -140,7 +144,6 @@ class Knob: | |||
| 140 | 144 | ||
| 141 | if str in (type(self._min), type(self._max)): | 145 | if str in (type(self._min), type(self._max)): |
| 142 | raise ValueError("'min', and 'max' fields of knob should not be str type.") | 146 | raise ValueError("'min', and 'max' fields of knob should not be str type.") |
| 143 | - | ||
| 144 | # Refresh scale. | 147 | # Refresh scale. |
| 145 | self._scale = None | 148 | self._scale = None |
| 146 | self.fresh_scale() | 149 | self.fresh_scale() |
| @@ -226,6 +229,7 @@ class Knob: | |||
| 226 | 'restart': self.restart, | 229 | 'restart': self.restart, |
| 227 | 'default': self.user_set if self.user_set is not None else self.original, | 230 | 'default': self.user_set if self.user_set is not None else self.original, |
| 228 | 'recommend': self.to_string(self.current), | 231 | 'recommend': self.to_string(self.current), |
| 232 | + 'current_value': self.to_string(self.current_value), | ||
| 229 | 'min': self._min, | 233 | 'min': self._min, |
| 230 | 'max': self._max | 234 | 'max': self._max |
| 231 | }} | 235 | }} |
| @@ -32,19 +32,22 @@ def round4(v): | |||
| 32 | return int(v + (4 - v % 4)) | 32 | return int(v + (4 - v % 4)) |
| 33 | 33 | ||
| 34 | 34 | ||
| 35 | -def instantiate_knob(name, recommend, knob_type, value_min=0, value_max=1, restart=False): | 35 | +def instantiate_knob(name, recommend, knob_type, current, value_min=0, value_max=1, restart=False): |
| 36 | if knob_type not in Knob.TYPE.ITEMS: | 36 | if knob_type not in Knob.TYPE.ITEMS: |
| 37 | raise TypeError("The type of parameter 'knob_type' is incorrect.") | 37 | raise TypeError("The type of parameter 'knob_type' is incorrect.") |
| 38 | 38 | ||
| 39 | if knob_type == Knob.TYPE.INT: | 39 | if knob_type == Knob.TYPE.INT: |
| 40 | recommend = int(recommend) | 40 | recommend = int(recommend) |
| 41 | + current = int(current) | ||
| 41 | value_max = int(value_max) | 42 | value_max = int(value_max) |
| 42 | value_min = int(value_min) | 43 | value_min = int(value_min) |
| 43 | elif knob_type == Knob.TYPE.FLOAT: | 44 | elif knob_type == Knob.TYPE.FLOAT: |
| 44 | recommend = float(recommend) | 45 | recommend = float(recommend) |
| 46 | + current = float(current) | ||
| 45 | value_max = float(value_max) | 47 | value_max = float(value_max) |
| 46 | value_min = float(value_min) | 48 | value_min = float(value_min) |
| 47 | elif knob_type == Knob.TYPE.BOOL: | 49 | elif knob_type == Knob.TYPE.BOOL: |
| 50 | + current_value_type = type(current) | ||
| 48 | value_type = type(recommend) | 51 | value_type = type(recommend) |
| 49 | if value_type is bool: | 52 | if value_type is bool: |
| 50 | recommend = 1 if recommend else 0 | 53 | recommend = 1 if recommend else 0 |
| @@ -54,12 +57,22 @@ def instantiate_knob(name, recommend, knob_type, value_min=0, value_max=1, resta | |||
| 54 | pass | 57 | pass |
| 55 | else: | 58 | else: |
| 56 | raise ValueError | 59 | raise ValueError |
| 57 | - | 60 | + # Convert the current value to the same type as the recommended value. |
| 61 | + if current_value_type is bool: | ||
| 62 | + current = 1 if current else 0 | ||
| 63 | + elif current_value_type is str and current_value_type in ('on', 'off'): | ||
| 64 | + current = 1 if current == 'on' else 0 | ||
| 65 | + elif current_value_type is int: | ||
| 66 | + pass | ||
| 67 | + else: | ||
| 68 | + raise ValueError | ||
| 69 | + | ||
| 58 | value_max = 1 | 70 | value_max = 1 |
| 59 | value_min = 0 | 71 | value_min = 0 |
| 60 | 72 | ||
| 61 | return Knob(name, | 73 | return Knob(name, |
| 62 | recommend=recommend, | 74 | recommend=recommend, |
| 75 | + current=current, | ||
| 63 | min=value_min, | 76 | min=value_min, |
| 64 | max=value_max, | 77 | max=value_max, |
| 65 | type=knob_type, | 78 | type=knob_type, |
| @@ -202,6 +215,7 @@ class OpenGaussKnobAdvisor: | |||
| 202 | return instantiate_knob(name="max_process_memory", | 215 | return instantiate_knob(name="max_process_memory", |
| 203 | recommend=suitable_mem, | 216 | recommend=suitable_mem, |
| 204 | knob_type=Knob.TYPE.INT, | 217 | knob_type=Knob.TYPE.INT, |
| 218 | + current=self.metric["max_process_memory"] * self.metric.block_size, | ||
| 205 | value_max=suitable_mem, | 219 | value_max=suitable_mem, |
| 206 | value_min=min_mem, | 220 | value_min=min_mem, |
| 207 | restart=True) | 221 | restart=True) |
| @@ -257,6 +271,7 @@ class OpenGaussKnobAdvisor: | |||
| 257 | return instantiate_knob(name="max_connections", | 271 | return instantiate_knob(name="max_connections", |
| 258 | recommend=recommend, | 272 | recommend=recommend, |
| 259 | knob_type=Knob.TYPE.INT, | 273 | knob_type=Knob.TYPE.INT, |
| 274 | + current=self.metric["max_connections"], | ||
| 260 | value_max=upper, | 275 | value_max=upper, |
| 261 | value_min=lower, | 276 | value_min=lower, |
| 262 | restart=True) | 277 | restart=True) |
| @@ -279,6 +294,7 @@ class OpenGaussKnobAdvisor: | |||
| 279 | return instantiate_knob(name="max_connections", | 294 | return instantiate_knob(name="max_connections", |
| 280 | recommend=recommend, | 295 | recommend=recommend, |
| 281 | knob_type=Knob.TYPE.INT, | 296 | knob_type=Knob.TYPE.INT, |
| 297 | + current=self.metric["max_connections"], | ||
| 282 | value_max=recommend * 2, | 298 | value_max=recommend * 2, |
| 283 | value_min=lower, | 299 | value_min=lower, |
| 284 | restart=True) | 300 | restart=True) |
| @@ -305,6 +321,7 @@ class OpenGaussKnobAdvisor: | |||
| 305 | return instantiate_knob(name="max_prepared_transactions", | 321 | return instantiate_knob(name="max_prepared_transactions", |
| 306 | recommend=max_conn.recommend, | 322 | recommend=max_conn.recommend, |
| 307 | knob_type=Knob.TYPE.INT, | 323 | knob_type=Knob.TYPE.INT, |
| 324 | + current=max_pt, | ||
| 308 | value_max=max_conn.max, | 325 | value_max=max_conn.max, |
| 309 | value_min=max_conn.min, | 326 | value_min=max_conn.min, |
| 310 | restart=True) | 327 | restart=True) |
| @@ -340,6 +357,7 @@ class OpenGaussKnobAdvisor: | |||
| 340 | return instantiate_knob(name="shared_buffers", | 357 | return instantiate_knob(name="shared_buffers", |
| 341 | recommend=recommend, | 358 | recommend=recommend, |
| 342 | knob_type=Knob.TYPE.INT, | 359 | knob_type=Knob.TYPE.INT, |
| 360 | + current=self.metric["shared_buffers"] * self.metric.block_size, | ||
| 343 | value_max=upper, | 361 | value_max=upper, |
| 344 | value_min=lower, | 362 | value_min=lower, |
| 345 | restart=True) | 363 | restart=True) |
| @@ -350,6 +368,7 @@ class OpenGaussKnobAdvisor: | |||
| 350 | return instantiate_knob(name="shared_buffers", | 368 | return instantiate_knob(name="shared_buffers", |
| 351 | recommend=recommend, | 369 | recommend=recommend, |
| 352 | knob_type=Knob.TYPE.INT, | 370 | knob_type=Knob.TYPE.INT, |
| 371 | + current=self.metric["shared_buffers"] * self.metric.block_size, | ||
| 353 | value_max=max(upper, lower), | 372 | value_max=max(upper, lower), |
| 354 | value_min=lower, | 373 | value_min=lower, |
| 355 | restart=True) | 374 | restart=True) |
| @@ -379,6 +398,7 @@ class OpenGaussKnobAdvisor: | |||
| 379 | return instantiate_knob(name="work_mem", | 398 | return instantiate_knob(name="work_mem", |
| 380 | recommend=recommend, | 399 | recommend=recommend, |
| 381 | knob_type=Knob.TYPE.INT, | 400 | knob_type=Knob.TYPE.INT, |
| 401 | + current=self.metric["work_mem"], | ||
| 382 | value_max=upper, | 402 | value_max=upper, |
| 383 | value_min=lower, | 403 | value_min=lower, |
| 384 | restart=False) | 404 | restart=False) |
| @@ -389,6 +409,7 @@ class OpenGaussKnobAdvisor: | |||
| 389 | return instantiate_knob(name="work_mem", | 409 | return instantiate_knob(name="work_mem", |
| 390 | recommend=recommend, | 410 | recommend=recommend, |
| 391 | knob_type=Knob.TYPE.INT, | 411 | knob_type=Knob.TYPE.INT, |
| 412 | + current=self.metric["work_mem"], | ||
| 392 | value_max=upper, | 413 | value_max=upper, |
| 393 | value_min=lower, | 414 | value_min=lower, |
| 394 | restart=False) | 415 | restart=False) |
| @@ -398,6 +419,7 @@ class OpenGaussKnobAdvisor: | |||
| 398 | return instantiate_knob(name="maintenance_work_mem", | 419 | return instantiate_knob(name="maintenance_work_mem", |
| 399 | recommend=self.work_mem.recommend * 10, | 420 | recommend=self.work_mem.recommend * 10, |
| 400 | knob_type=Knob.TYPE.INT, | 421 | knob_type=Knob.TYPE.INT, |
| 422 | + current=self.metric["maintenance_work_mem"], | ||
| 401 | value_max=self.work_mem.recommend * 20, | 423 | value_max=self.work_mem.recommend * 20, |
| 402 | value_min=self.work_mem.recommend, | 424 | value_min=self.work_mem.recommend, |
| 403 | restart=False) | 425 | restart=False) |
| @@ -411,6 +433,7 @@ class OpenGaussKnobAdvisor: | |||
| 411 | return instantiate_knob(name="effective_cache_size", | 433 | return instantiate_knob(name="effective_cache_size", |
| 412 | recommend=lower, | 434 | recommend=lower, |
| 413 | knob_type=Knob.TYPE.INT, | 435 | knob_type=Knob.TYPE.INT, |
| 436 | + current=self.metric["effective_cache_size"] * self.metric.block_size, | ||
| 414 | value_max=upper, | 437 | value_max=upper, |
| 415 | value_min=lower, | 438 | value_min=lower, |
| 416 | restart=False) | 439 | restart=False) |
| @@ -418,6 +441,7 @@ class OpenGaussKnobAdvisor: | |||
| 418 | return instantiate_knob(name="effective_cache_size", | 441 | return instantiate_knob(name="effective_cache_size", |
| 419 | recommend=upper, | 442 | recommend=upper, |
| 420 | knob_type=Knob.TYPE.INT, | 443 | knob_type=Knob.TYPE.INT, |
| 444 | + current=self.metric["effective_cache_size"] * self.metric.block_size, | ||
| 421 | value_max=upper, | 445 | value_max=upper, |
| 422 | value_min=lower, | 446 | value_min=lower, |
| 423 | restart=False) | 447 | restart=False) |
| @@ -431,6 +455,7 @@ class OpenGaussKnobAdvisor: | |||
| 431 | return instantiate_knob(name="effective_io_concurrency", | 455 | return instantiate_knob(name="effective_io_concurrency", |
| 432 | recommend=2, | 456 | recommend=2, |
| 433 | knob_type=Knob.TYPE.INT, | 457 | knob_type=Knob.TYPE.INT, |
| 458 | + current=self.metric["effective_io_concurrency"], | ||
| 434 | value_max=4, | 459 | value_max=4, |
| 435 | value_min=0, | 460 | value_min=0, |
| 436 | restart=False) | 461 | restart=False) |
| @@ -438,6 +463,7 @@ class OpenGaussKnobAdvisor: | |||
| 438 | return instantiate_knob(name="effective_io_concurrency", | 463 | return instantiate_knob(name="effective_io_concurrency", |
| 439 | recommend=200, | 464 | recommend=200, |
| 440 | knob_type=Knob.TYPE.INT, | 465 | knob_type=Knob.TYPE.INT, |
| 466 | + current=self.metric["effective_io_concurrency"], | ||
| 441 | value_max=250, | 467 | value_max=250, |
| 442 | value_min=150, | 468 | value_min=150, |
| 443 | restart=False) | 469 | restart=False) |
| @@ -459,6 +485,7 @@ class OpenGaussKnobAdvisor: | |||
| 459 | return instantiate_knob(name="wal_buffers", | 485 | return instantiate_knob(name="wal_buffers", |
| 460 | recommend=self.shared_buffers.recommend * 1 / 32, | 486 | recommend=self.shared_buffers.recommend * 1 / 32, |
| 461 | knob_type=Knob.TYPE.INT, | 487 | knob_type=Knob.TYPE.INT, |
| 488 | + current=self.metric["wal_buffers"] * self.metric.block_size, | ||
| 462 | value_max=max(self.shared_buffers.recommend * 1 / 32, blocks_16m), | 489 | value_max=max(self.shared_buffers.recommend * 1 / 32, blocks_16m), |
| 463 | value_min=min(self.shared_buffers.recommend * 1 / 64, blocks_16m), | 490 | value_min=min(self.shared_buffers.recommend * 1 / 64, blocks_16m), |
| 464 | restart=True) | 491 | restart=True) |
| @@ -472,6 +499,7 @@ class OpenGaussKnobAdvisor: | |||
| 472 | return instantiate_knob(name="wal_buffers", | 499 | return instantiate_knob(name="wal_buffers", |
| 473 | recommend=self.shared_buffers.recommend * 1 / 32, | 500 | recommend=self.shared_buffers.recommend * 1 / 32, |
| 474 | knob_type=Knob.TYPE.INT, | 501 | knob_type=Knob.TYPE.INT, |
| 502 | + current=self.metric["wal_buffers"], | ||
| 475 | value_max=self.shared_buffers.recommend * 1 / 32, | 503 | value_max=self.shared_buffers.recommend * 1 / 32, |
| 476 | value_min=blocks_16m, | 504 | value_min=blocks_16m, |
| 477 | restart=True) | 505 | restart=True) |
| @@ -479,6 +507,7 @@ class OpenGaussKnobAdvisor: | |||
| 479 | return instantiate_knob(name="wal_buffers", | 507 | return instantiate_knob(name="wal_buffers", |
| 480 | recommend=-1, | 508 | recommend=-1, |
| 481 | knob_type=Knob.TYPE.INT, | 509 | knob_type=Knob.TYPE.INT, |
| 510 | + current=self.metric["wal_buffers"] * self.metric.block_size, | ||
| 482 | value_max=-1, | 511 | value_max=-1, |
| 483 | value_min=-1, | 512 | value_min=-1, |
| 484 | restart=True) | 513 | restart=True) |
| @@ -491,6 +520,7 @@ class OpenGaussKnobAdvisor: | |||
| 491 | return instantiate_knob(name="random_page_cost", | 520 | return instantiate_knob(name="random_page_cost", |
| 492 | recommend=3, | 521 | recommend=3, |
| 493 | knob_type=Knob.TYPE.FLOAT, | 522 | knob_type=Knob.TYPE.FLOAT, |
| 523 | + current=self.metric["random_page_cost"], | ||
| 494 | value_max=4, | 524 | value_max=4, |
| 495 | value_min=2, | 525 | value_min=2, |
| 496 | restart=False) | 526 | restart=False) |
| @@ -498,6 +528,7 @@ class OpenGaussKnobAdvisor: | |||
| 498 | return instantiate_knob(name="random_page_cost", | 528 | return instantiate_knob(name="random_page_cost", |
| 499 | recommend=1, | 529 | recommend=1, |
| 500 | knob_type=Knob.TYPE.FLOAT, | 530 | knob_type=Knob.TYPE.FLOAT, |
| 531 | + current=self.metric["random_page_cost"], | ||
| 501 | value_max=2, | 532 | value_max=2, |
| 502 | value_min=1, | 533 | value_min=1, |
| 503 | restart=False) | 534 | restart=False) |
| @@ -530,6 +561,7 @@ class OpenGaussKnobAdvisor: | |||
| 530 | return instantiate_knob(name="default_statistics_target", | 561 | return instantiate_knob(name="default_statistics_target", |
| 531 | recommend=recommend, | 562 | recommend=recommend, |
| 532 | knob_type=Knob.TYPE.INT, | 563 | knob_type=Knob.TYPE.INT, |
| 564 | + current=self.metric["default_statistics_target"], | ||
| 533 | value_max=1000, | 565 | value_max=1000, |
| 534 | value_min=50, | 566 | value_min=50, |
| 535 | restart=False) | 567 | restart=False) |
| @@ -546,6 +578,7 @@ class OpenGaussKnobAdvisor: | |||
| 546 | return instantiate_knob(name="default_statistics_target", | 578 | return instantiate_knob(name="default_statistics_target", |
| 547 | recommend=recommend, | 579 | recommend=recommend, |
| 548 | knob_type=Knob.TYPE.INT, | 580 | knob_type=Knob.TYPE.INT, |
| 581 | + current=self.metric["default_statistics_target"], | ||
| 549 | value_max=150, | 582 | value_max=150, |
| 550 | value_min=10, | 583 | value_min=10, |
| 551 | restart=False) | 584 | restart=False) |
| @@ -553,6 +586,7 @@ class OpenGaussKnobAdvisor: | |||
| 553 | return instantiate_knob(name="default_statistics_target", | 586 | return instantiate_knob(name="default_statistics_target", |
| 554 | recommend=100, | 587 | recommend=100, |
| 555 | knob_type=Knob.TYPE.INT, | 588 | knob_type=Knob.TYPE.INT, |
| 589 | + current=self.metric["default_statistics_target"], | ||
| 556 | value_max=300, | 590 | value_max=300, |
| 557 | value_min=80, | 591 | value_min=80, |
| 558 | restart=False) | 592 | restart=False) |
| @@ -565,6 +599,7 @@ class OpenGaussKnobAdvisor: | |||
| 565 | return instantiate_knob(name="enable_nestloop", | 599 | return instantiate_knob(name="enable_nestloop", |
| 566 | recommend=0, | 600 | recommend=0, |
| 567 | knob_type=Knob.TYPE.BOOL, | 601 | knob_type=Knob.TYPE.BOOL, |
| 602 | + current=self.metric["enable_nestloop"], | ||
| 568 | value_max=1, | 603 | value_max=1, |
| 569 | value_min=0, | 604 | value_min=0, |
| 570 | restart=False) | 605 | restart=False) |
| @@ -577,6 +612,7 @@ class OpenGaussKnobAdvisor: | |||
| 577 | return instantiate_knob(name="enable_mergejoin", | 612 | return instantiate_knob(name="enable_mergejoin", |
| 578 | recommend=0, | 613 | recommend=0, |
| 579 | knob_type=Knob.TYPE.BOOL, | 614 | knob_type=Knob.TYPE.BOOL, |
| 615 | + current=self.metric["enable_mergejoin"], | ||
| 580 | value_max=1, | 616 | value_max=1, |
| 581 | value_min=0, | 617 | value_min=0, |
| 582 | restart=False) | 618 | restart=False) |
| @@ -589,6 +625,7 @@ class OpenGaussKnobAdvisor: | |||
| 589 | return instantiate_knob(name="enable_hashjoin", | 625 | return instantiate_knob(name="enable_hashjoin", |
| 590 | recommend=1, | 626 | recommend=1, |
| 591 | knob_type=Knob.TYPE.BOOL, | 627 | knob_type=Knob.TYPE.BOOL, |
| 628 | + current=self.metric["enable_hashjoin"], | ||
| 592 | value_max=1, | 629 | value_max=1, |
| 593 | value_min=0, | 630 | value_min=0, |
| 594 | restart=False) | 631 | restart=False) |