Addonics SIS3124 Controller and T

dieterbsd at engineer.com dieterbsd at engineer.com
Thu Feb 10 00:36:25 UTC 2011


Jose Amengual writes:
> Strangely enough just switching drives now I can see all ten, weird
> but is working now.

Perhaps there was a loose conection or something.

> I'm confused why you are referring to a JMB393s if my card has a
> siis3124 chip....or are you referring o the PMs?

If I'm reading
http://www.addonics.com/products/raid_tower/raid_rack.asp
correctly, it comes with 4 SATA Port Multipliers based on
the JMB393 chip.

Do you get something like

  PM Product ID: 37261095

in dmesg?  I just got a PM based on the Sil3726.  So far so good.
I've been running some simple speed tests on it and various
controllers.  If you and your machine have a few minutes to spare,
I'd love to see similar numbers for the siis3124 controller and the
JMB393 PM.

First I ran one disk at a time:

nforce4-ultra controller  chipset  ata(4)
  ad4  249.404517 MB/s
  ad6  250.143419 MB/s
  ad8  239.214086 MB/s
  ad10 249.628334 MB/s

SiI 3132  PCIe-x1  siis(4)
  ada0 127.737664 MB/s
  ada1 110.236024 MB/s
  ada2 110.210423 MB/s

JMB363  PCIe-x1  ahci(4)
  ada3 131.443644 MB/s
  Sil3726 Port Multiplier
    ada4 130.895997 MB/s
    ada5 130.259701 MB/s
    ada6 132.400908 MB/s
    ada7 114.306864 MB/s
    ada8 130.986963 MB/s

I need to rerun the tests (machine is busy right now) and see if the
results are consistant.  Some of the differences may be due to the
different make & model drives.

2 disks at once - port multiplier drives ada4, ada5
  48.034694 MB/s and 48.034701 MB/s
  Total: 96.069395 MB/s

2 disks at once - same card (jmb363) ada3 direct connection, ada5 via PM
  86.059754 MB/s and 85.664682 MB/s
  Total: 171.724436 MB/s

3 disks at once - port multiplier drives ada4, ada5, ada6
  31.728884 MB/s, 31.727878 MB/s, and 31.727715 MB/s
  Total: 95.184477 MB/s

4 disks at once - port multiplier drives ada4, ada5, ada6, ada8
 23.657665 MB/s  23.657404 MB/s   23.657416 MB/s  23.657436 MB/s
 Total: 94.629921 MB/s

5 port multiplier disks at once
 18.660235 MB/s  18.659920 MB/s  18.659928 MB/s  18.659925 MB/s
 18.665027 MB/s
5 port multiplier disks at once plus the other port of the jmb363
 105.348778 MB/s  17.821848 MB/s  17.821214 MB/s  17.821113 MB/s
 17.821120 MB/s  17.821458 MB/s
 PM total (5 drives):    89.106753 MB/s
 Card total (6 drives): 194.455531 MB/s

Neither the 3132 nor the 363 controllers can max out the PCIe-x1 link
(250 MB/s each direction).  Previous testing indicates that both
achive a higher total with one disk reading and the other writing.
(not sure why)  Port multipliers may be the same, I haven't had time
to test that case yet.  I also want to test the PM with the 3132.

Silicon Image SATA controllers are not the fastest.  The JMB363 is
faster than the 3132, so I wonder if the JMB393 port multiplier is
faster than the Sil3726?   I've read that the 3124 controller is
fast, the question is how fast?

Below is the small C program I used.  It just reads a small amount
of data over and over again from the drive's RAM cache.  This avoids
limitations of data density on the platters, rpm, seek time, etc.


/*
 * read_disk_cache_speed.c
 *
 * Read data from a disk's RAM cache buffer.
 * Useful for testing the speed of controllers and port multipliers
 * without the limitation of how fast the disk can read data from the
 * platters.  Note that the drive's electronics could still be the
 * limiting factor.
 *
 * Syntax: read_disk_cache_speed device readsize iterations
 *         FreeBSD:
 *           read_disk_cache_speed /dev/ada0 65536 10000
 *         NetBSD:
 *           read_disk_cache_speed /dev/rwd0c 65536 10000
 *
 * Original program was by:
 *          Manuel Bouyer <bouyer at antioche.eu.org>
 *          NetBSD: 26 ans d'experience feront toujours la difference
 * Updated by:
 *          Dieter <dieterbsd at engineer.com>
 *          Added command line argument for buffer/read size.
 *          (originally hard coded at 64 KiB)
 *          Read data into drive's RAM buffer before beginning timing.
 *
 */

#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char **argv)
{
  int fd;                    /* file descriptor */
  int i;                     /* loop counter */
  struct timeval tv0, tv1;
  long t;                     /* elapsed time */
  char *buffer;
  long buffer_size;

  if ( argc != 4 )
    {
      fprintf(stderr, "Syntax:  %s device readsize iterations\n",
              argv[0]);
      fprintf(stderr, "Example: %s /dev/ada4 65536 10000\n", argv[0]);
      exit(1);
    }

  buffer_size = atoi(argv[2]);
  buffer = malloc(buffer_size);
  if ( buffer == NULL )
    {
      perror("malloc failed");
      exit(1);
    }

  fd = open(argv[1], O_RDONLY, 0);
  if (fd < 0)
    {
      perror("open failed");
      exit(1);
    }
  /* Get the data from the platter into the drive's RAM buffer
   * before we start timing.
   */
  if (read(fd, (void *)buffer, buffer_size) != buffer_size)
    {
      perror("read failed");
      exit(1);
    }
  if (lseek(fd, 0, SEEK_SET) < 0)
    {
      perror("lseek failed");
      exit(1);
    }

  if (gettimeofday(&tv0, NULL) < 0)
    {
      perror("gettimeofday failed");
      exit(1);
    }
  for (i = 0; i < atoi(argv[3]); i++)
    {
      if (read(fd, (void *)buffer, buffer_size) != buffer_size)
        {
          perror("read failed");
          exit(1);
        }
      if (lseek(fd, 0, SEEK_SET) < 0)
        {
          perror("lseek failed");
          exit(1);
        }
    }
  if (gettimeofday(&tv1, NULL) < 0)
    {
      perror("gettimeofday failed");
      exit(1);
    }
  t = (tv1.tv_sec - tv0.tv_sec) * 1000000;
  t = t + tv1.tv_usec - tv0.tv_usec;
  printf("%ld us, %f MB/s\n", t,
   ((double)buffer_size * (double)i / 1000000) / ((double)t / 1000000));
  exit(0);
}

 Total: 93.305028 MB/s




More information about the freebsd-hardware mailing list