Documente Academic
Documente Profesional
Documente Cultură
Disclaimer
2
2
Solution description
Storage configuration
Targeted customer profile
Tested deployment
3
4
6
6
Best practices
Conclusion
10
11
11
13
15
16
18
Overview
This solution brief provides information on an HP D2600 disk enclosure and HP Smart Array P411 storage solution for
Microsoft Exchange Server 2010 (Exchange), based on the Microsoft Exchange Solution Review Program (ESRP)
Storage Program.
The ESRP Storage Program was developed by Microsoft Corporation to provide a common storage testing framework
for vendors to provide information on their storage solutions for Microsoft Exchange Server software. For more details
on the Microsoft ESRP V3.0 Storage Program, please see:
http://technet.microsoft.com/en-us/exchange/2010/ff182054.aspx
Tested with: ESRP Storage Version 3.0
Test Date: June 2012
Disclaimer
This document has been produced independently of Microsoft Corporation. Microsoft Corporation expressly disclaims
responsibility for, and makes no warranty, express or implied, with respect to the accuracy of the contents of this
document.
Affordable storage
HP D2000 disk enclosures double the transfer rate of current 3Gb solutions, adding crucial bandwidth.
The HP D2000 disk enclosures modular platform allows customers to purchase based on current need and future
growth, no hidden management charges.
Ability to add enterprise-class dual-port SAS drives as the need and budget dictates
Affordable redundancy and reliability, reducing or eliminating single points of failure within the storage network.
Flexible and scalable
Flexibility to mix and match SAS and SATA drives in the same enclosure. Extends benefit of tiered storage to direct
attach customers. Solid State drives supported in the D2700.
The D2600 LFF can grow up to 96 drives. Up to four Large Form Factor (LFF) enclosures can be connected together
from a single controller port.
The D2700 SFF can grow up to 200 drives. Up to four Small Form Factor (SFF) enclosures can be connected together
from a single controller port.
Easy to manage
The HP D2000 disk enclosures use familiar HP ProLiant management tools including HP Systems Insight Manager and
the HP Array Configuration Utility (ACU) software.
The HP D2000 disk enclosures are compatible with selected HP Smart Array SAS controllers.
Little IT expertise is required.
Solution description
This solution brief provides tested best practices to help administrators implement the Exchange deployment, with the
following criteria:
HP has developed the HP Sizer for Microsoft Exchange Server 2010 to assist customers with proper server and storage
sizing for their Exchange Server 2010 deployments. The algorithms developed and implemented in this tool are based
upon extensive testing of Exchange Server 2010 server roles and technologies, HPs deep experience with Microsoft
Exchange, and intricate knowledge of server CPU, memory and I/O subsystems. This tool is free to download and use,
and is designed to simplify configuration across a broad range of deployments. For more information, please visit:
hp.com/solutions/microsoft/exchange2010/sizer
Figure 1 below illustrates the tested solution hardware. Each server in this solution utilizes all (12) 3TB MDL SAS Disks
for database, logs and content indexing all on the same volumes. Recovery space (often referred as the restore LUN) can
be provided using drives within the server.
Figure 1: Rack mounted view of the hardware used in this solution
HP
DL360 G7
SAS MDL
HP
StorageWorks
D2600
1.0TB
SAS
UID
146 GB
6G DP 15k
SAS MDL
1.0TB
SAS
6G DP 15k
146 GB
SAS
1.0TB
SAS MDL
6G DP 15k
146 GB
SAS
6G DP 15k
SAS MDL
1.0TB
146 GB
SID
SAS MDL
1.0TB
SAS MDL
SAS MDL
1.0TB
1.0TB
SAS MDL
1.0TB
1.0TB
SAS MDL
1.0TB
SAS MDL
SAS MDL
9 12
1.0TB
7 10
SAS MDL
UID
1
1.0TB
ProLiant
Storage configuration
In this solution, the D2600 disk enclosure is attached to a Smart Array P411 controller and configured using the HP Array
Configuration Utility (ACU). The Smart Array P411 controller manages RAID configuration and LUN ownership. For
storage performance and redundancy, the D2600 and P411 are cabled as a dual-domain configuration. The dual-domain
configuration uses two independent SAS data paths from the servers to the storage. The dual-domain communication
path prevents disk I/O from being interrupted in the event of a single data path failure. For more detail on implementing
a dual-domain configuration with the D2600, please see:
http://h20000.www2.hp.com/bizsupport/TechSupport/Home.jsp?prodTypeId=12169&prodSeriesId=3954787
Figure 2 below illustrates the dual-domain configuration used in this solution.
Figure 2: Dual-Domain Configuration
PLC B
1200W
iLO
94%
UID
PLC B
TOP
1200W
94%
UID
I/O A
P1
PS 1
3
I/O B
UID
Attention
This module fits 3.5" large
form factor drives only.
Mfg
P1
PS 2
P2
Mfg
P2
UID
Attention
This module fits 3.5" large
form factor drives only.
The disk layout containing the mailbox databases and logs were created using RAID 1. Each RAID 1 disk group consisted
of (2) 3 TB disks, for a total of (6) RAID groups. Since Exchange was configured for multiple database copies, the
databases and logs resided on the same volumes.
Figures 3 and 4 below show how the active mailbox databases would be distributed during normal and failed operations
in order to maintain production. This solution was tested will all active mailbox databases on one server, simulating the
worst case scenario.
Figure 3: Primary Data Center with (2) Member DAG Normal Operation
MBX2
MBX1
DAG1
Active
Passive
DB1
DB1
DB2
DB2
DB3
DB3
DB4
DB4
DB5
DB5
DB6
DB6
Figure 4: Primary Data Center with (2) Member DAG MBX2 Offline Due to Fault
MBX2
MBX1
DAG1
Active
Passive
DB1
DB1
DB2
DB2
DB3
DB3
DB4
DB4
DB5
DB5
DB6
DB6
2000 users total, with (2) active Exchange servers and two (2) database copies
0.24 IOPS per user (0.2 with additional 20% headroom)
4 GB tested mailbox size
Database Availability Group (DAG) deployment with 2 copies of each database in the DAG
6 databases total on each server (3 active and 3 passive) during normal operations
Database background maintenance (DBM) configured during testing
Tested deployment
The following table summarizes the testing environment.
Simulated Exchange configuration
Number of Exchange mailboxes simulated
2000
1000
Number of databases/host
Number of copies/database
Number of mailboxes/database
167
0.24
3 TB
Storage hardware
Storage Connectivity
SAS
Storage cache
See below
1 per server
Storage Controller
Controller Cache
HP ProLiant DL360 G7
12
Storage software
Smart Array P411 Driver
6.24.0.64
Not applicable
Multipathing
Not applicable
Host OS
14.02.0283.000
3 TB
12
36 TB
Not applicable
RAID level
18 TB
50%
Formatted capacity / Total raw capacity
24%
Total Database size / Total raw capacity
* Capacity of drives, and therefore the raw data capacity of the disk array, is based on 1K = 1000, not 1024.
This means that 1 GB = 1,000,000,000 bytes, not (1,073,741,824 bytes)
Best practices
Exchange Server is a disk-intensive application. For Exchange 2010 best practices on storage design from Microsoft, visit
http://technet.microsoft.com/en-us/library/dd346703.aspx. For Exchange Server solution guidance, visit HP at
hp.com/solutions/microsoft/exchange.
The best practices for this solution are:
Dual Domain
The HP Smart Array Advanced Pack is required to enable this feature. Dual domain creates redundant pathways for
external drives from server to storage devices. The redundant paths created by these configurations reduce or
eliminate single points of failure within the storage network. For more information on the Smart Array Advanced
Pack, see: http://h18004.www1.hp.com/products/quickspecs/13200_div/13200_div.pdf
Jetstress 2010
Before installing Exchange Server 2010, test your storage solution with Jetstress to ensure it is configured properly
and meets your requirements. For more information on Jetstress, see:
http://technet.microsoft.com/en-us/library/ff706601
RAID Level
The disks used in this solution were configured as RAID 1 pairs with a RAID stripe size of 256 KB (256 KB or better is
recommended). Provisioning of other RAID types are supported but not recommended for this Exchange Server
solution.
Reliability
One of the tests in the framework is designed to test reliability over a 24-hour test period. The goal is to verify that the
storage can handle high I/O load for a long period of time. Both log and database files will be analyzed for integrity after
the stress test to ensure no database/log corruption.
Below is an initial list of questions used to validate testing.
Q.
A.
Q.
A.
Database I/O
Database Disk Transfers/sec
701
438
263
15.02
0.84
240
0.17
39.49
226.56
3.61
Conclusion
The information discussed in this solution brief highlights the tested performance results and configuration best
practices for an Exchange Server solution supporting 2,000 Exchange users with 4 GB mailboxes. Testing was performed
with an HP Smart Array P411 controller and D2600 disk enclosure with (12) 3 TB MDL SAS 7.2k RPM disks for the
Exchange database storage and transaction logs. The testing demonstrated that the storage subsystem was capable of
supporting both the IOPS needed to support 2,000 Exchange users as well as providing additional headroom.
This document was developed by HP Storage, and reviewed by the Microsoft Exchange product team. The test results
and data presented in this document are based on the tests introduced in the ESRP test framework and should be used
as a guide. Each specific deployment should be tested to ensure that their solution performs to the requirements of their
specific environment.
The ESRP program is not designed to be a benchmarking program. The tests are not designed to measure the maximum
throughput for a given solution. Rather, it is focused on producing recommendations from vendors for Exchange Server
storage solutions. So the data presented in this document should not be used for direct comparisons among solutions.
10
Pass
Machine Name
D2600
Test Description
6/20/2012 2:14:39 PM
6/21/2012 7:58:02 AM
6/20/2012 4:17:45 PM
Jetstress Version
14.01.0225.017
ESE Version
14.02.0283.000
Operating System
Performance Log
480
8597483683840
8616081227776
4 (per database)
192.0 MB
1536.0 MB
Insert Operations
40%
Delete Operations
20%
Replace Operations
5%
Read Operations
35%
Lazy Commits
70%
Database Configuration
Instance4956.1 Log path: E:\dblg1
Database: E:\dblg1\Jetstress001001.edb
Instance4956.2 Log path: F:\dblg2
Database: F:\dblg2\Jetstress002001.edb
Instance4956.3 Log path: G:\dblg3
Database: G:\dblg3\Jetstress003001.edb
Instance4956.4 Log path: H:\dblg4
Database: H:\dblg4\Jetstress004001.edb
Instance4956.5 Log path: I:\dblg5
Database: I:\dblg5\Jetstress005001.edb
Instance4956.6 Log path: J:\dblg6
Database: J:\dblg6\Jetstress006001.edb
Transactional I/O Performance
MSExchange
I/O
I/O
Database ==>
Database Database
Instances
Reads
Writes
Average
Average
Latency
Latency
(msec)
(msec)
I/O
I/O
I/O
Database Database Database
Reads/sec Writes/sec Reads
Average
Bytes
Instance4956.1 19.184
1.126
73.681
44.141
Instance4956.2 14.362
1.019
72.532
43.507
Instance4956.3 14.120
0.912
71.925
Instance4956.4 14.340
0.801
Instance4956.5 13.953
Instance4956.6 14.180
I/O
Database
Writes
Average
Bytes
I/O Log
Reads
Average
Latency
(msec)
I/O Log
Writes
Average
Latency
(msec)
I/O Log
I/O Log
I/O Log
Reads/sec Writes/sec Reads
Average
Bytes
I/O Log
Writes
Average
Bytes
0.179
0.000
40.362
0.000
4449.584
0.173
0.000
39.711
0.000
4525.801
43.072
0.171
0.000
39.550
0.000
4524.763
73.573
44.205
0.168
0.000
39.874
0.000
4490.570
0.684
73.184
43.943
0.172
0.000
40.111
0.000
4495.380
0.526
73.533
44.174
0.167
0.000
40.297
0.000
4470.200
24.682
261821.157
Instance4956.2
26.274
261867.887
Instance4956.3
27.991
261877.541
Instance4956.4
26.136
261830.558
Instance4956.5
27.947
261913.182
Instance4956.6
26.287
261880.308
11
0.725
229163.171
Instance4956.2
0.725
227221.111
Instance4956.3
0.721
226735.595
Instance4956.4
0.721
221394.928
Instance4956.5
0.727
224793.535
Instance4956.6
0.726
227221.111
I/O
Database
Writes
Average
Latency
(msec)
I/O
I/O
I/O
Database Database Database
Reads/sec Writes/sec Reads
Average
Bytes
Instance4956.1 19.184
1.126
98.362
44.141
Instance4956.2 14.362
1.019
98.806
43.507
Instance4956.3 14.120
0.912
99.917
Instance4956.4 14.340
0.801
Instance4956.5 13.953
Instance4956.6 14.180
I/O
Database
Writes
Average
Bytes
I/O Log
Reads
Average
Bytes
0.179
0.725
40.362
229163.171 4449.584
0.173
0.725
39.711
227221.111 4525.801
43.072
0.171
0.721
39.550
226735.595 4524.763
99.709
44.205
0.168
0.721
39.874
221394.928 4490.570
0.684
101.131
43.943
0.172
0.727
40.111
224793.535 4495.380
0.526
99.820
44.174
0.167
0.726
40.297
227221.111 4470.200
Average
Minimum
Maximum
% Processor Time
0.606
0.381
1.593
Available MBytes
44663.404
44565.000
44798.000
33555094.004
33555068.000
33555604.000
0.000
0.000
103770777.600 99627008.000
147685376.000
0.000
0.000
0.000
I/O Log
Reads
Average
Latency
(msec)
I/O Log
Writes
Average
Bytes
12
24 hour test
Test Summary
Overall Test Result
Pass
Machine Name
D2600
Test Description
24 Hour Stress Test 2000 users, 0.24 IOPS, 4GB Mailbox, TC=4
6/21/2012 3:49:15 AM
6/23/2012 7:57:59 PM
6/22/2012 3:50:50 AM
Jetstress Version
14.01.0225.017
ESE Version
14.02.0283.000
Operating System
Performance Log
480
8616081227776
8623496757248
4 (per database)
192.0 MB
1536.0 MB
Insert Operations
40%
Delete Operations
20%
Replace Operations
5%
Read Operations
35%
Lazy Commits
70%
Database Configuration
Instance4956.1 Log path: E:\dblg1
Database: E:\dblg1\Jetstress001001.edb
Instance4956.2 Log path: F:\dblg2
Database: F:\dblg2\Jetstress002001.edb
Instance4956.3 Log path: G:\dblg3
Database: G:\dblg3\Jetstress003001.edb
Instance4956.4 Log path: H:\dblg4
Database: H:\dblg4\Jetstress004001.edb
Instance4956.5 Log path: I:\dblg5
Database: I:\dblg5\Jetstress005001.edb
Instance4956.6 Log path: J:\dblg6
Database: J:\dblg6\Jetstress006001.edb
Transactional I/O Performance
MSExchange
I/O
Database ==>
Database
Instances
Reads
Average
Latency
(msec)
I/O
Database
Writes
Average
Latency
(msec)
I/O
Database
Reads/sec
I/O
Database
Writes/sec
I/O
Database
Reads
Average
Bytes
I/O
Database
Writes
Average
Bytes
I/O Log
Reads
Average
Latency
(msec)
I/O Log
Writes
Average
Latency
(msec)
I/O Log
I/O Log
I/O Log
Reads/sec Writes/sec Reads
Average
Bytes
I/O Log
Writes
Average
Bytes
Instance4956.1
19.439
1.536
72.475
44.502
33979.413
35354.852
0.000
0.180
0.000
39.094
0.000
4461.371
Instance4956.2
14.572
1.412
72.369
44.395
34737.014
35348.660
0.000
0.172
0.000
39.085
0.000
4489.613
Instance4956.3
14.644
1.299
72.673
44.602
34454.474
35350.243
0.000
0.175
0.000
39.203
0.000
4517.859
Instance4956.4
14.501
1.183
72.423
44.418
34578.030
35376.733
0.000
0.173
0.000
39.069
0.000
4513.190
Instance4956.5
14.416
1.040
73.033
44.840
34561.193
35346.953
0.000
0.173
0.000
39.233
0.000
4490.878
Instance4956.6
14.326
0.713
72.582
44.521
34543.802
35352.108
0.000
0.173
0.000
39.225
0.000
4497.710
24.137
261850.973
Instance4956.2
26.308
261814.560
Instance4956.3
27.500
261866.496
Instance4956.4
26.220
261871.005
Instance4956.5
27.266
261830.224
Instance4956.6
26.286
261845.486
13
0.703
224644.930
Instance4956.2
0.707
223816.799
Instance4956.3
0.714
223953.439
Instance4956.4
0.711
225456.483
Instance4956.5
0.710
223813.479
Instance4956.6
0.711
223680.324
I/O
Database
Writes
Average
Latency
(msec)
I/O
Database
Reads/sec
I/O
Database
Writes/sec
I/O
Database
Reads
Average
Bytes
I/O
Database
Writes
Average
Bytes
I/O Log
Reads
Average
Latency
(msec)
I/O Log
Writes
Average
Latency
(msec)
I/O Log
I/O Log
I/O Log
Reads/sec Writes/sec Reads
Average
Bytes
Instance4956.1
19.439
1.536
96.612
44.502
90909.760
35354.852
0.307
0.180
0.703
39.094
224644.930 4461.371
Instance4956.2
14.572
1.412
98.677
44.395
95277.190
35348.660
0.313
0.172
0.707
39.085
223816.799 4489.613
Instance4956.3
14.644
1.299
100.173
44.602
96885.692
35350.243
0.285
0.175
0.714
39.203
223953.439 4517.859
Instance4956.4
14.501
1.183
98.643
44.418
94993.859
35376.733
0.319
0.173
0.711
39.069
225456.483 4513.190
Instance4956.5
14.416
1.040
100.299
44.840
96343.806
35346.953
0.285
0.173
0.710
39.233
223813.479 4490.878
Instance4956.6
14.326
0.713
98.868
44.521
94976.837
35352.108
0.323
0.173
0.711
39.225
223680.324 4497.710
Average
Minimum
Maximum
% Processor Time
0.578
0.329
1.680
Available MBytes
44631.408
44533.000
44749.000
33555092.224
33555068.000
33555606.000
0.000
0.000
0.000
0.000
I/O Log
Writes
Average
Bytes
0.000
14
1370642.59
11:03:37
34.42
Instance4956.2
1370658.59
09:38:25
39.49
Instance4956.3
1370674.59
09:52:23
38.56
Instance4956.4
1370650.59
10:09:27
37.48
Instance4956.5
1370674.59
09:56:35
38.29
Instance4956.6
1370658.59
09:56:08
38.32
40%
Delete Operations
20%
Replace Operations
5%
Read Operations
35%
Lazy Commits
70%
Database Configuration
Instance4956.1 Log path: E:\dblg1
Backup path: E:\dblg1
Database: E:\dblg1\Jetstress001001.edb
I/O
I/O
I/O
Database Database Database
Reads/sec Writes/sec Reads
Average
Bytes
Instance4956.1 14.590
0.000
137.645
0.000
Instance4956.2 12.239
0.000
157.881
0.000
Instance4956.3 12.443
0.000
154.135
Instance4956.4 13.037
0.000
Instance4956.5 12.605
Instance4956.6 12.462
I/O
Database
Writes
Average
Bytes
I/O Log
Reads
Average
Latency
(msec)
I/O Log
Writes
Average
Latency
(msec)
I/O Log
I/O Log
I/O Log I/O Log Writes Average
Reads/sec Writes/sec Reads
Bytes
Average
Bytes
262144.000 0.000
0.000
0.000
0.000
0.000
0.000
0.000
262144.000 0.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
262144.000 0.000
0.000
0.000
0.000
0.000
0.000
0.000
149.737
0.000
262144.000 0.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
153.122
0.000
262144.000 0.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
153.171
0.000
262144.000 0.000
0.000
0.000
0.000
0.000
0.000
0.000
Average
Minimum
Maximum
% Processor Time
1.647
0.138
9.719
Available MBytes
36556.803
28410.000
44561.000
33555423.659
33555089.000
33556630.000
0.000
76758.493
291893529.098
184979456.000 370069504.000
0.000
0.000
0.000
15
507
1925.8722846
Instance3728.2
501
1698.8606859
Instance3728.3
505
1837.5605295
Instance3728.4
501
1795.6588559
Instance3728.5
507
1825.6265085
Instance3728.6
502
1824.8309071
Database Configuration
Instance3728.1 Log path: E:\dblg1
Database: E:\dblg1\Jetstress001001.edb
Instance3728.2 Log path: F:\dblg2
Database: F:\dblg2\Jetstress002001.edb
Instance3728.3 Log path: G:\dblg3
Database: G:\dblg3\Jetstress003001.edb
Instance3728.4 Log path: H:\dblg4
Database: H:\dblg4\Jetstress004001.edb
Instance3728.5 Log path: I:\dblg5
Database: I:\dblg5\Jetstress005001.edb
Instance3728.6 Log path: J:\dblg6
Database: J:\dblg6\Jetstress006001.edb
I/O
Database
Writes
Average
Latency
(msec)
I/O
Database
Reads/sec
I/O
Database
Writes/sec
I/O
Database
Reads
Average
Bytes
I/O
Database
Writes
Average
Bytes
I/O Log
Reads
Average
Latency
(msec)
I/O Log
Writes
Average
Latency
(msec)
I/O Log
I/O Log
I/O Log
Reads/sec Writes/sec Reads
Average
Bytes
Instance3728.1
31.898
0.146
201.504
1.565
39712.223
30784.134
12.585
0.000
2.348
0.000
216293.968 0.000
Instance3728.2
26.897
0.152
230.403
1.752
39495.015
31991.507
14.238
0.000
2.628
0.000
225673.565 0.000
Instance3728.3
28.938
0.150
211.628
1.634
39476.706
31549.059
15.325
0.000
2.451
0.000
223249.550 0.000
Instance3728.4
27.884
0.136
217.222
1.654
39500.766
31445.525
11.688
0.000
2.481
0.000
223225.070 0.000
Instance3728.5
28.063
0.591
211.880
1.649
39490.763
31252.300
12.564
0.000
2.472
0.000
221847.152 0.000
Instance3728.6
27.756
0.586
215.655
1.645
39533.731
31324.476
12.081
0.000
2.467
0.000
221930.935 0.000
23.789
261964.328
Instance3728.2
22.999
261901.856
Instance3728.3
24.784
261829.348
Instance3728.4
22.084
261840.030
Instance3728.5
24.450
261919.446
Instance3728.6
22.311
261922.509
16
I/O Log
Writes
Average
Bytes
I/O
Database
Writes
Average
Latency
(msec)
I/O
I/O
Database Database
Reads/sec Writes/sec
I/O
Database
Reads
Average
Bytes
I/O
Database
Writes
Average
Bytes
I/O Log
Reads
Average
Latency
(msec)
I/O Log
Writes
Average
Latency
(msec)
I/O Log
I/O Log
I/O Log
Reads/sec Writes/sec Reads
Average
Bytes
Instance3728.1
31.898
0.146
225.293
1.565
63180.448
30784.134
12.585
0.000
2.348
0.000
216293.968 0.000
Instance3728.2
26.897
0.152
253.402
1.752
59681.089
31991.507
14.238
0.000
2.628
0.000
225673.565 0.000
Instance3728.3
28.938
0.150
236.413
1.634
62787.141
31549.059
15.325
0.000
2.451
0.000
223249.550 0.000
Instance3728.4
27.884
0.136
239.306
1.654
60019.331
31445.525
11.688
0.000
2.481
0.000
223225.070 0.000
Instance3728.5
28.063
0.591
236.330
1.649
62502.438
31252.300
12.564
0.000
2.472
0.000
221847.152 0.000
Instance3728.6
27.756
0.586
237.966
1.645
60383.850
31324.476
12.081
0.000
2.467
0.000
221930.935 0.000
Average
Minimum
Maximum
% Processor Time
0.689
0.000
2.010
Available MBytes
42658.475
42567.000
43968.000
33555604.196
33555603.000
33555606.000
0.000
4535.049
0.000
0.000
I/O Log
Writes
Average
Bytes
0.000
17
Get connected
hp.com/go/getconnected
Current HP driver, support, and security alerts
delivered directly to your desktop
Copyright 2012 Hewlett-Packard Development Company, L.P. The information contained herein is subject to change without notice. The only
warranties for HP products and services are set forth in the express warranty statements accompanying such products and services. Nothing herein
should be construed as constituting an additional warranty. HP shall not be liable for technical or editorial errors or omiss ions contained herein.
Microsoft and Windows are U.S. registered trademarks of Microsoft Corporation.
18
4AA4-3116ENW, Created September 2012; Updated September 2012, Rev. 1