MySQL Server – Break Point !!

MySQL 클라이언트에서 MySQL Protocol / Payload  를 보던, Trace 를 해보든…

어딘가에 Break Point 를 잡아야 하는데, MySQL Client 는 그냥저냥 따라가면 쉽지만…

MySQL Server 는 어디를 어떻게 잡아야 할지 난감합니다. Multi-Process 기반이 Multi-Thread 기반보다는 Debugging 이 용이하죠. 물론 와리가리하는 경우는 반대로 Multi-Thread 가 더 편하고요.

참고 :

https://oxnz.github.io/2016/07/20/mysql-primer-source/#connection

 

MySQL 은 handler connection manager 가 말그대로 connection 을 처리하기 때문에 가장 먼저 잡으시면 됩니다. ( thread 이름으로 충분히 추측이 가능하기 때문에 필요에 따라서 각 thread 에 break point 를 잡으셔서 활용하시면 편합니다. )

MySQL Server – Break Point !!

슬라이드11

 

MySQL Client -> Server 로 Command 란 프로토콜?! 으로 Server Side 에 각 프로세스를 진행합니다.  MySQL Source 에서 원하는 곳을 검색하거나, Trace 할 때 용이합니다.

my_command.h

/* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */

#ifndef _mysql_command_h
#define _mysql_command_h

/**
@enum enum_server_command
@brief You should add new commands to the end of this list, otherwise old
servers won’t be able to handle them as ‘unsupported’.
*/
enum enum_server_command
{
COM_SLEEP,
COM_QUIT,
COM_INIT_DB,
COM_QUERY,
COM_FIELD_LIST,
COM_CREATE_DB,
COM_DROP_DB,
COM_REFRESH,
COM_SHUTDOWN,
COM_STATISTICS,
COM_PROCESS_INFO,
COM_CONNECT,
COM_PROCESS_KILL,
COM_DEBUG,
COM_PING,
COM_TIME,
COM_DELAYED_INSERT,
COM_CHANGE_USER,
COM_BINLOG_DUMP,
COM_TABLE_DUMP,
COM_CONNECT_OUT,
COM_REGISTER_SLAVE,
COM_STMT_PREPARE,
COM_STMT_EXECUTE,
COM_STMT_SEND_LONG_DATA,
COM_STMT_CLOSE,
COM_STMT_RESET,
COM_SET_OPTION,
COM_STMT_FETCH,
COM_DAEMON,
COM_BINLOG_DUMP_GTID,
COM_RESET_CONNECTION,
/* don’t forget to update const char *command_name[] in sql_parse.cc */

/* Must be last */
COM_END
};

#endif /* _mysql_command_h */

 

my_sqlcommand.h

/* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */

#ifndef _mysql_sql_command_h
#define _mysql_sql_command_h

/*
@enum enum_sql_command
@brief SQL Commands

SQL Command is resolved during SQL parsing and assigned to the Lex
object, accessible from the THD.

When a command is added here, be sure it’s also added in mysqld.cc
in “struct show_var_st status_vars[]= {” …

If the command returns a result set or is not allowed in stored
functions or triggers, please also make sure that
sp_get_flags_for_command (sp_head.cc) returns proper flags for the
added SQLCOM_.
*/
enum enum_sql_command {
SQLCOM_SELECT,
SQLCOM_CREATE_TABLE,
SQLCOM_CREATE_INDEX,
SQLCOM_ALTER_TABLE,
SQLCOM_UPDATE,
SQLCOM_INSERT,
SQLCOM_INSERT_SELECT,
SQLCOM_DELETE,
SQLCOM_TRUNCATE,
SQLCOM_DROP_TABLE,
SQLCOM_DROP_INDEX,
SQLCOM_SHOW_DATABASES,
SQLCOM_SHOW_TABLES,
SQLCOM_SHOW_FIELDS,
SQLCOM_SHOW_KEYS,
SQLCOM_SHOW_VARIABLES,
SQLCOM_SHOW_STATUS,
SQLCOM_SHOW_ENGINE_LOGS,
SQLCOM_SHOW_ENGINE_STATUS,
SQLCOM_SHOW_ENGINE_MUTEX,
SQLCOM_SHOW_PROCESSLIST,
SQLCOM_SHOW_MASTER_STAT,
SQLCOM_SHOW_SLAVE_STAT,
SQLCOM_SHOW_GRANTS,
SQLCOM_SHOW_CREATE,
SQLCOM_SHOW_CHARSETS,
SQLCOM_SHOW_COLLATIONS,
SQLCOM_SHOW_CREATE_DB,
SQLCOM_SHOW_TABLE_STATUS,
SQLCOM_SHOW_TRIGGERS,
SQLCOM_LOAD,
SQLCOM_SET_OPTION,
SQLCOM_LOCK_TABLES,
SQLCOM_UNLOCK_TABLES,
SQLCOM_GRANT,
SQLCOM_CHANGE_DB,
SQLCOM_CREATE_DB,
SQLCOM_DROP_DB,
SQLCOM_ALTER_DB,
SQLCOM_REPAIR,
SQLCOM_REPLACE,
SQLCOM_REPLACE_SELECT,
SQLCOM_CREATE_FUNCTION,
SQLCOM_DROP_FUNCTION,
SQLCOM_REVOKE,
SQLCOM_OPTIMIZE,
SQLCOM_CHECK,
SQLCOM_ASSIGN_TO_KEYCACHE,
SQLCOM_PRELOAD_KEYS,
SQLCOM_FLUSH,
SQLCOM_KILL,
SQLCOM_ANALYZE,
SQLCOM_ROLLBACK,
SQLCOM_ROLLBACK_TO_SAVEPOINT,
SQLCOM_COMMIT,
SQLCOM_SAVEPOINT,
SQLCOM_RELEASE_SAVEPOINT,
SQLCOM_SLAVE_START,
SQLCOM_SLAVE_STOP,
SQLCOM_START_GROUP_REPLICATION,
SQLCOM_STOP_GROUP_REPLICATION,
SQLCOM_BEGIN,
SQLCOM_CHANGE_MASTER,
SQLCOM_CHANGE_REPLICATION_FILTER,
SQLCOM_RENAME_TABLE,
SQLCOM_RESET,
SQLCOM_PURGE,
SQLCOM_PURGE_BEFORE,
SQLCOM_SHOW_BINLOGS,
SQLCOM_SHOW_OPEN_TABLES,
SQLCOM_HA_OPEN,
SQLCOM_HA_CLOSE,
SQLCOM_HA_READ,
SQLCOM_SHOW_SLAVE_HOSTS,
SQLCOM_DELETE_MULTI,
SQLCOM_UPDATE_MULTI,
SQLCOM_SHOW_BINLOG_EVENTS,
SQLCOM_DO,
SQLCOM_SHOW_WARNS,
SQLCOM_EMPTY_QUERY,
SQLCOM_SHOW_ERRORS,
SQLCOM_SHOW_STORAGE_ENGINES,
SQLCOM_SHOW_PRIVILEGES,
SQLCOM_HELP,
SQLCOM_CREATE_USER,
SQLCOM_DROP_USER,
SQLCOM_RENAME_USER,
SQLCOM_REVOKE_ALL,
SQLCOM_CHECKSUM,
SQLCOM_CREATE_PROCEDURE,
SQLCOM_CREATE_SPFUNCTION,
SQLCOM_CALL,
SQLCOM_DROP_PROCEDURE,
SQLCOM_ALTER_PROCEDURE,
SQLCOM_ALTER_FUNCTION,
SQLCOM_SHOW_CREATE_PROC,
SQLCOM_SHOW_CREATE_FUNC,
SQLCOM_SHOW_STATUS_PROC,
SQLCOM_SHOW_STATUS_FUNC,
SQLCOM_PREPARE,
SQLCOM_EXECUTE,
SQLCOM_DEALLOCATE_PREPARE,
SQLCOM_CREATE_VIEW,
SQLCOM_DROP_VIEW,
SQLCOM_CREATE_TRIGGER,
SQLCOM_DROP_TRIGGER,
SQLCOM_XA_START,
SQLCOM_XA_END,
SQLCOM_XA_PREPARE,
SQLCOM_XA_COMMIT,
SQLCOM_XA_ROLLBACK,
SQLCOM_XA_RECOVER,
SQLCOM_SHOW_PROC_CODE,
SQLCOM_SHOW_FUNC_CODE,
SQLCOM_ALTER_TABLESPACE,
SQLCOM_INSTALL_PLUGIN,
SQLCOM_UNINSTALL_PLUGIN,
SQLCOM_BINLOG_BASE64_EVENT,
SQLCOM_SHOW_PLUGINS,
SQLCOM_CREATE_SERVER,
SQLCOM_DROP_SERVER,
SQLCOM_ALTER_SERVER,
SQLCOM_CREATE_EVENT,
SQLCOM_ALTER_EVENT,
SQLCOM_DROP_EVENT,
SQLCOM_SHOW_CREATE_EVENT,
SQLCOM_SHOW_EVENTS,
SQLCOM_SHOW_CREATE_TRIGGER,
SQLCOM_ALTER_DB_UPGRADE,
SQLCOM_SHOW_PROFILE,
SQLCOM_SHOW_PROFILES,
SQLCOM_SIGNAL,
SQLCOM_RESIGNAL,
SQLCOM_SHOW_RELAYLOG_EVENTS,
SQLCOM_GET_DIAGNOSTICS,
SQLCOM_ALTER_USER,
SQLCOM_EXPLAIN_OTHER,
SQLCOM_SHOW_CREATE_USER,
SQLCOM_SHUTDOWN,
SQLCOM_ALTER_INSTANCE,
/* This should be the last !!! */
SQLCOM_END
};

#endif /* _mysql_sql_command_h */

 

 

 

 

 

Advertisements

How to Emulate NVMe and Persistent Memory Using DRAM – Part 1

예전에는 실제 물리서버가 아닌 노트북 ( laptop ), 가상머신 ( Virtual Machine ) 또는 클라우드 플랫폼 ( Cloud Platform ) 에서의 시뮬레이션 및 성능자료에 대한 신뢰성이 많이 떨어졌지만, 이제는 데이터셋 ( Dataset, Small Data ) 만 작다면 왠만한 물리서버에서보다도 더 좋은 성능결과를 보여주고 있습니다. 물론, 호환성도 옛말이 되어버렸고요. ( Hypervisor 버그 같은거 빼고요. ㅠㅠ )

그리고, 밴더 서버에는 Cert 된 장비만을 써야 하기 때문에 가격적인 부담과 여유장비부족, 시간부족, 인력부족 등의 이유로 테스트베드 ( Test Bed ) 도 만들어 볼 여력이 안생깁니다. ㅠㅠ

그래서, 한대쯤 가지고 있는 최신의?! 노트북을 이용해서 NVMe ( Non-Volatile Memory Express ) 와  PMEM ( Persistent Memory ) 을 에뮬레이션하는 방법을 소개하도록 하겠습니다.

마음 같아서는 Mark ( http://smalldatum.blogspot.kr/ ) 처럼 Intel NUC Skull Canyon ( 2018 업글버전 나옴 ) 을 사고 싶지만…  2대 연결 Thunderbolt3 40Gb/s 도 포기하고… ㅠㅠ

intel-nuc-boxnuc6i7kyk3-specs-large

1. 디바이스 스펙 ( Device Spec ) 확인하기

1.1   PMEM ( Persistent Memory ) using DRAM

말그대로 DRAM 을 이용하기 때문에 별도의 디바이스가 필요 없습니다.

VirtualBox 에 메모리만 1~2GB 정도 더 잡아주면 됩니다. 설마 노트북 메모리가  4GB 는 아니시겠죠?! ㅠㅠ

1.2 NVMe ( Non-Volatile Memory Express )

1-2년안에 구입하신 노트북이라면 M.2  NVMe ( Next Generation M.2 SSD Based on NVMe Protocol (PCIe, Gen. 3, x4)  ) 2280 form factor  많이 지원하실 겁니다.  얇고 길다란 놈이죠.

저는 처음에 저렴이가 들어 있었습니다. 트랜센더 TS128GMTS800 128GB !! ㅠㅠ

R/W, IOPS 알아두면 좋으니 확인하세요. 탐색기->드라이브->속성->하드웨어 보시면 나옵니다.

만약에, 없다면?! 상관없습니다. 그냥 SSD 로 대신 에뮬레이트하면 되니깐요!? 개진도진!? ㅠㅠ

TS128GMTS800 128GB

http://www.amazon.com/Transcend-128GB-MTS800-Solid-TS128GMTS800/dp/B00KLTPURI

1.3 SSD or HDD

제 노트북에는 M.2 2280 x 2개, 2.5 inch internal 1개, 2.5 inch external 1개  빵빵합니다. 그대신 무겁고, 두껍죠!! ㅠㅠ

NVMe, PM 과 비교하기 위해서는 SSD or HDD 스펙도 알아두면 좋겠죠!? 역시 탐색기->드라이브->속성->하드웨어에서 확인하실 수 있습니다. SSD 는  Samsung 850 Pro 256GB 좀 좋은거 샀네요. ㅠㅠ

( 아마존이 참 비교 잘해놔서 이럴 때 좋더라구요. ^^ 국내 쇼핑몰 도입이 시급합니다. ㅠㅠ )

Samsung 850 Pro 256GB

http://www.amazon.com/Samsung-850-PRO-2-5-Inch-MZ-7KE256BW/dp/B00LMXBOP4

1.4 NVMe ?! PMEM ?!

혹시 NVMe, PMEM 은 뭔가요?! 하실 분이 계셔서… ^^; 저도 잘 모릅니다. ㅠㅠ

http://nvmexpress.org 

https://www.snia.org/

http://pmem.io/

Flash Memory Summit ( 여기서 NVMe 로 검색하셔서 몇개 열어서 그림만 보시면 대충은… ㅠㅠ )

https://www.flashmemorysummit.com/English/Collaterals/Proceedings/2015/Proceedings_Chrono_2015.html

https://www.flashmemorysummit.com/English/Collaterals/Proceedings/2016/Proceedings_Chrono_2016.html

https://www.flashmemorysummit.com/English/Conference/Proceedings_Chrono.html

2. VirtualBox 컨트롤러 추가하기

2.0 배포판 이미지 받기!!

저는 그냥 osboxes 사이트에서 받습니다. 배포판 종류는 선호하시는 것을 선택하셔도 무방하나?! PMEM 와 DAX 지원여부로 인해서 Kernel Version 체크를 하셔야 합니다.

http://www.osboxes.org/virtualbox-images

Kernel Version !!

https://pmem.io/2016/02/22/pm-emulation.html

Download kernel sources from official kernel pagesSupport for persistent memory devices and emulation is present in Kernel since 4.0 version, however it is recommended to use Kernel newer then 4.2 due to easier configuration of it. Following instruction relies on 4.2 or newer. Using Kernel older then 4.2 will require a bit more work to setup, and will not be described here. Please note, that features and bug fixes around DAX support are being implemented as we speak, therefore it is recommended to use the newest stable Kernel if possible.

https://www.snia.org/sites/default/files/PM-Summit/2017/presentations/Coughlan_Tom_PM_in_Linux.pdf

Fedora 23 shipped with pmem support

( min. kernel version 4.4 )

RHEL 7.3 shipped with

Full support for pmem as a block device

Technical Preview for pmem in Direct Access (DAX) mode

http://www.suse.com/c/nvdimm-enabling-suse-linux-enterprise-12-service-pack-2/

SUSE Linux Enterprise 12, Service Pack 2 (SLE 12 SP 2) includes early support for NVDIMMs. This support includes kernel enabling as well as userspace libraries and configuration utilities available in the standard SUSE Linux Enterprise package repositories. This post will provide a high level overview of the concepts involved in persistent memory enabling. We will talk about NVDIMMs and the various ways in which they can be configured. We will also talk about related software techniques such as memory Direct Access (DAX) and the Block Translation Table (BTT).

사실 그냥 최신 배포판  받으시면 됩니다. 우분투 17.04 받으세요. ㅠㅠ

혹시 왜 NVMe 는 커널버전 체크를 안하죠?! 하신 분들은… PMEM 되는 버전이면 NVMe 은 이미 진작에… ㅠㅠ

2.1 VirtualBox Controller 추가하기

1) 설정 -> 저장소 -> NVMe 컨트롤러 추가하기

SNAG-0002 2018-04-13 오후 5.36.44

2) 설정 -> 저장소 -> 새 저장소 연결(생성)하기 

이 때 ” 새 디크스 만들기” 이미지 폴더를 NVMe 드라이브로 선택해주시면 됩니다.  첨부터 NVMe 드라이브에 이미지를 받으셨다면 동일하게 하시면 되고, SSD 드라이브에 받으셨다면 달리 하셔야 겠죠!? 따블체크!!

VDI 타입으로 용량은 적당히 알아서, 고정으로 해주시면 될 것 같습니다.
SNAG-0003 2018-04-13 오후 5.37.46

혹시나 SSD 체크를 하시면… “선택하면 게스트 운영 체제에 이 미디어를 SSD 로 표시합니다 “ 말 그대로입니다. 체크하시면 안됩니다. ㅠㅠ

SNAG-0004 2018-04-13 오후 5.38.22

2.2 NVMe 설정

1) NVMe 컨트롤러 확인하기

$ lspci | grep -i volatile
00:0e.0 Non-Volatile memory controller: InnoTek Systemberatung GmbH Device 4e56

2) 디스크 확인하기

$ lsblk

...

nvme0n1 259:0 0 2G 0 disk 
└─nvme0n1p1 259:1 0 2G 0 part

...

$ ll /dev/nvme0
crw------- 1 root root 246, 0 Apr 13 18:05 /dev/nvme0

$ ll /dev/nvme*n1
brw-rw---- 1 root disk 259, 0 Apr 13 18:05 /dev/nvme0n1

3) 커널모드 확인하기

$ modinfo nvme
filename: /lib/modules/4.13.0-38-generic/kernel/drivers/nvme/host/nvme.ko
version: 1.0
license: GPL
author: Matthew Wilcox <willy@linux.intel.com>
srcversion: 8004EED1FD4FBE659DBBEC2
alias: pci:v0000106Bd00002003sv*sd*bc*sc*i*
alias: pci:v0000106Bd00002001sv*sd*bc*sc*i*
alias: pci:v*d*sv*sd*bc01sc08i02*
alias: pci:v0000144Dd0000A822sv*sd*bc*sc*i*
alias: pci:v0000144Dd0000A821sv*sd*bc*sc*i*
alias: pci:v00001C5Fd00000540sv*sd*bc*sc*i*
alias: pci:v00001C58d00000003sv*sd*bc*sc*i*
alias: pci:v00008086d00005845sv*sd*bc*sc*i*
alias: pci:v00008086d0000F1A5sv*sd*bc*sc*i*
alias: pci:v00008086d00000A55sv*sd*bc*sc*i*
alias: pci:v00008086d00000A54sv*sd*bc*sc*i*
alias: pci:v00008086d00000A53sv*sd*bc*sc*i*
alias: pci:v00008086d00000953sv*sd*bc*sc*i*
depends: nvme-core
intree: Y
name: nvme
vermagic: 4.13.0-38-generic SMP mod_unload 
signat: PKCS#7
signer: 
sig_key: 
sig_hashalgo: md4
parm: use_threaded_interrupts:int
parm: use_cmb_sqes:use controller's memory buffer for I/O SQes (bool)
parm: max_host_mem_size_mb:Maximum Host Memory Buffer (HMB) size per controller (in MiB) (uint)
parm: io_queue_depth:set io queue depth, should >= 2


$ lsmod | grep nvm
nvme 32768 0
nvme_core 53248 1 nvme

4)  hdparm ( Direct I/O )

트랜센더 NVMe 이 저가형이고, 삼성 850 Pro SSD 는 좀 고가형이라서 그런지 생각보다는 성능차이가 많이 안나네요?! latency 는 조금 더 많이 차이가 날 것도 같습니다.

$ sudo hdparm -tT --direct /dev/nvme0n1

/dev/nvme0n1:
Timing O_DIRECT cached reads: 4770 MB in 2.00 seconds = 2388.75 MB/sec
Timing O_DIRECT disk reads: 2048 MB in 1.02 seconds = 2008.89 MB/sec

$ hdparm -tT --direct /dev/sda1 

/dev/sda1:
 Timing O_DIRECT cached reads: 4690 MB in 2.00 seconds = 2348.09 MB/sec
 Timing O_DIRECT disk reads: 4336 MB in 3.00 seconds = 1443.58 MB/sec

5) 파티션 생성 ( n -> p -> 1 -> default sector numbers, enter, enter -> w )

$ sudo fdisk /dev/nvme0n1

6) 파일시스템 생성

$ sudo mkfs -t ext4 /dev/nvme0n1p1

7) 마운트 디렉토리 생성 및 마운트

$ sudo mkdir /media/nvme

$ sudo mount /dev/nvme0n1p1 /media/nvme

8) fstab 추가하기

$ sudo blkid

$ vi /etc/fstab
UUID=<nvme UUID> /media/nvme ext4 defaults 0 0

9) 쥉장!! 나보다 빠르다!! 2년전인데…  PCIe 는 넘사벽인가!? 아니면, M.2 NVMe 새로 사야 하나? ㅠㅠ

링크 : https://richardstechnotes.wordpress.com/2015/12/18/setting-up-an-nvme-ssd-on-ubuntu-14-04-lts/ 

10) nvme-cli 설치하기 ( https://github.com/linux-nvme/nvme-cli )

$ apt show nvme-cli
Package: nvme-cli
Version: 1.3-1
Priority: optional
Section: universe/admin
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Breno Leitao <leitao@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 337 kB
Depends: libc6 (>= 2.14)
Homepage: https://github.com/linux-nvme/nvme-cli
Download-Size: 156 kB
APT-Sources: http://us.archive.ubuntu.com/ubuntu artful/universe amd64 Packages
Description: userspace tooling to control NVMe drives
NVMe is a fast, scalable, direct attached storage interface, accessing
solid state drives through PCIe.
.
The nvme CLI contains core management tools with minimal dependencies.

3. 결론

참 쉽죠?! ㅠㅠ

일단 NVMe 이나 SSD 나 뭔 차이냐고 하실 것 같은데요!? 그냥 드라이버 차이라고 생각하시면 편하긴 한데요!? H/W 아키텍쳐랑도 상관이 있어서… PCIe 가 진리라… ㅠㅠ

SATA_Express_interface.svg

https://en.wikipedia.org/wiki/M.2

참 좋은데~ 남녀노소 누구에게나 좋은데~ 참 말로 표현을 못하겠네요!!~ ㅠㅠ

nvmestack

그리고, nvme-cli 를 설치하셔서 로그, namespace 구성, 등을 하실 수 있는데…

Oracle VirtualBox 에서는 기본적으로 NVMe 컨트롤러는 1개밖에 지원을 안하는 것 같네요. 아마도 일부러 막아 놓은 것 같기도 하고, 제 컨트롤러가 1개랑 맵핑이 1개만 되는건지?!  가상으로 NVMe 컨트롤러 여러개를 테스트할 수는 없을 것 같습니다.  요즘 NVMe SSD 가 TB 급으로 나오니 한장만 꼽아서 써도 master 용으로는 무리가 없겠지만… 예전에 듣기로는 일정 용량이 넘어가면 성능저하가 있다고 하더군요. 매년갈수록 좋아진다고 해도 컨트롤러로 개발에 한계가 있다보니… 지금도 대동소이하리라 봅니다. 결국 성능과 안정성을 위해서는 적정용량 PCIe 2장이상을 꼽아야 하고, flash storage 용으로는 당연히 여러장을 꼽아야 하니깐요!? 근데, 이 정도면 장비를 렌트해야죠!? ㅠㅠ

( 확인 해보니, UI 상으로는 IDE, SATA, SCSI, … 등 각 컨트롤러 1개씩만 추가가 됩니다. 이는 실제 칩셋과 각 컨트롤러를 1:1 매핑하는 것 같습니다. CLI 를 통해서는 SATA 컨트롤러가 복수개 할당이 되나, “잘못된 설정 감지됨” 으로 해당 칩셋에 복수개의 컨트롤러가 할당이 되어서, 다른 칩셋을 선택하거나, 1개만 설정하라고 나옵니다. 일반적인 노트북에서는 NVMe 컨트롤러가 복수가 존재할리가 없기 때문에 스펙상 256 이상 가능하다고 하였으나, 노트북에서는 불가능합니다. ㅠㅠ  )

암튼, 맥북에서도 그냥 쓰시던 분들에게도 한번 해보시길 권합니다. 맥북이 없는 가난뱅이로써… ㅠㅠ

Next Part 2…